P3368 【模板】树状数组 2

题面

呐,又是一道树状数组模板题,区间修改+单点查询,稍微难了一点,用树状数组维护原数组的差分数组,输出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\n",u[k]+sum(k));//如开头所说
44         }
45     }
46     return 0;
47 }

 

posted @ 2019-07-17 11:42  喵呜,颜儿ღ  阅读(92)  评论(0编辑  收藏  举报