树状数组区间修改&&**……*&%&……
好吧,我看了Running-coder的博客,久久才明白……
废话不多说:讲思路:无………………
代码:
1 #include2 #include 3 #include 4 #include 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< <