呐,又是一道树状数组模板题,区间修改+单点查询,稍微难了一点,用树状数组维护原数组的差分数组,输出i时即为原数组下标为i的值加上差分数组下标为i的前缀和
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int N=500005; 7 8 int n,m; 9 int a[N],u[N]; 10 11 int lowbit(int l){return l&(-l);}//求前后子树的根节点 12 13 int sum(int k){//前缀求和 14 int an=0; 15 for(;k;k-=lowbit(k)){ 16 an+=a[k]; 17 } 18 return an; 19 } 20 21 int main(){ 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<=n;i++){ 24 scanf("%d",&u[i]); 25 } 26 for(int i=1;i<=m;i++){ 27 int p; 28 scanf("%d",&p); 29 if(p==1){//差分数组的思想 30 int k,l,r; 31 scanf("%d%d%d",&l,&r,&k); 32 for(;l<=n;l+=lowbit(l)){ 33 a[l]+=k; 34 } 35 r++; 36 for(;r<=n;r+=lowbit(r)){ 37 a[r]-=k; 38 } 39 } 40 else{ 41 int k; 42 scanf("%d",&k); 43 printf("%d ",u[k]+sum(k));//如开头所说 44 } 45 } 46 return 0; 47 }