树状数组2模板 Luogu 3368

树状数组区间修改&&**……*&%&……

好吧,我看了Running-coder的博客,久久才明白……

废话不多说:讲思路:无………………

 

代码:

 1  #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 int bit[1000000],n,m,d,p,xx,yy,kk;
 7 int lazy[1000000];
 8 int a[1000000];
 9 
10 void add(int i,int x){
11     while(i<=n){
12         bit[i]+=x;
13         i+=i & -i;
14     }
15 }
16 
17 void addn(int x,int y,int k){
18     while(y>=x){
19         lazy[y]+=k;
20         y -=y & -y;
21     }
22     x--;
23     while(x>y){
24         lazy[x]-=k;
25         x -=x& -x;
26     }
27 }
28 
29 int sum(int i){
30     int s=a[i];
31     while(i<=n){
32         s+=lazy[i];
33         i+=i & -i;
34     }
35     return s;
36 }
37 
38 int main(){
39     scanf("%d %d",&n,&m);
40     for(int j=1;j<=n;j++){
41         scanf("%d",&d);
42         add(j,d);
43         a[j]=d;
44     }
45     for(int j=1;j<=m;j++){
46         scanf("%d",&p);
47         switch (p){
48             case 1:{
49                 scanf("%d %d %d",&xx,&yy,&kk);
50                 addn(xx,yy,kk);
51                 break;
52             }
53             case 2:{
54                 scanf("%d",&xx);
55                 cout<<sum(xx)<<endl;
56                 break;
57             }
58         }
59     }
60     return 0;
61 }  

 

posted @ 2017-08-21 18:58  Ezreal_Misaki  阅读(204)  评论(0编辑  收藏  举报