package 模板; import java.util.Arrays; import java.util.Scanner; public class 线段树 { //单点修改,区间查询 static int sum[]=new int[40],a[]=new int[40]; //区间查询 public static int que(int L,int R,int l,int r,int k) { if(L<=l&&R>=r) { return sum[k]; } int t=(l+r)>>1; int ans=0; if(L<=t) ans+=que(L,R,l,t,k<<1); if(R>t) ans+=que(L,R,t+1,r,k<<1|1); return ans; } //建树 public static void build(int l,int r,int k) { //k表示的是节点标记数 if(l==r) { sum[k]=a[l]; //设初始值为0 System.out.println(l+" "+r+" "+k); return; } int t=(l+r)>>1; build(l,t,k<<1); build(t+1,r,k<<1|1); sum[k]=sum[k<<1]+sum[k<<1|1]; // System.out.println(sum[k]); } //点更新 static void update(int p,int c,int l,int r,int k) { if(l==r) { sum[k]+=c; //sum[k]=c; return; } int t=(l+r)>>1; if(p<=t) update(p,c,l,t,k<<1); else update(p, c, t+1, r, k<<1|1); sum[k]=sum[k<<1]+sum[k<<1|1]; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int n=sc.nextInt(); build(1, n, 1); for(int i=0;i<n;i++) { int aa=sc.nextInt(); int bb=sc.nextInt(); int cc=sc.nextInt(); if(aa==1) { update(1, cc, 1, n, bb); }else { int[] mm=sum; Arrays.parallelSort(mm,bb,cc); System.out.println(mm[cc]); } } } }
[模板]单点修改,区间查询——java
最新推荐文章于 2022-12-04 21:58:35 发布