1. 程式人生 > >樹狀數組2模板 Luogu 3368

樹狀數組2模板 Luogu 3368

str scanf while -- 模板 ret color scan 數組

樹狀數組區間修改&&**……*&%&……

好吧,我看了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 }

樹狀數組2模板 Luogu 3368