标签:++ syn while c++ pre col name amp false
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long tree[400005],flag[400005],deep; 4 long long firstbit(int x){ 5 int ans=0; 6 x++; 7 while(x){ 8 ans++; 9 x>>=1; 10 } 11 return 1<<ans; 12 } 13 long long query(int lc,int rc){ 14 long long l=lc+deep-1,r=rc+deep+1,j=rc-lc+1,ans=0,lv=0,rv=0; 15 for(int p=1;l^r^1;p<<=1,l>>=1,r>>=1){ 16 ans+=flag[l]*lv;ans+=flag[r]*rv; 17 if(~l&1){ 18 ans+=tree[l^1];lv+=p; 19 } 20 if( r&1){ 21 ans+=tree[r^1];rv+=p; 22 } 23 } 24 ans+=flag[l]*lv;ans+=flag[r]*rv; 25 for(l>>=1;l;l>>=1) 26 ans+=flag[l]*j; 27 return ans; 28 } 29 void update(int w,int v){ 30 for(tree[w+=deep]+=v,w>>=1;w;w>>=1) 31 tree[w]+=v; 32 } 33 void update(int lc,int rc,int v){ 34 int l=lc+deep-1,r=rc+deep+1,val=v*(rc-lc+1),lv=0,rv=0; 35 for(int p=v;l^r^1;p<<=1,l>>=1,r>>=1){ 36 tree[l]+=lv;tree[r]+=rv; 37 if(~l&1){ 38 flag[l^1]+=v;tree[l^1]+=p;lv+=p; 39 } 40 if( r&1){ 41 flag[r^1]+=v;tree[r^1]+=p;rv+=p; 42 } 43 } 44 tree[l]+=lv;tree[r]+=rv; 45 for(l>>=1;l;l>>=1) 46 tree[l]+=val; 47 } 48 int main(){ 49 int n,flag,k; 50 ios::sync_with_stdio(false); 51 cin>>n>>k; 52 deep=firstbit(n); 53 for(int i=1;i<=n;i++) 54 cin>>tree[deep+i]; 55 for(int i=deep-1;i;i--) 56 tree[i]=tree[i<<1]+tree[i<<1|1]; 57 while(k){ 58 k--; 59 cin>>flag; 60 if(flag==1){ 61 int a,b,c; 62 cin>>a>>b>>c; 63 update(a,b,c); 64 } 65 else if(flag==2){ 66 int a,b; 67 cin>>a>>b; 68 cout<<query(a,b)<<endl; 69 } 70 else { 71 int a,b; 72 cin>>a>>b; 73 update(a,b); 74 } 75 } 76 return 0; 77 }
标签:++ syn while c++ pre col name amp false
原文地址:http://www.cnblogs.com/HC-LittleJian/p/7501596.html