题目链接:hiho1080
直接看代码吧,两个标记分开处理
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define mod 1000000007 5 #define pi (4*atan(1.0)) 6 const int N=1e5+10,M=1e6+10,inf=1e9+10; 7 ll sum[N*4],lazy[N*4],flag[N*4]; 8 void pushdown(ll pos,ll len) 9 { 10 ll lson=pos*2; 11 ll rson=pos*2+1; 12 if(flag[pos]) 13 { 14 lazy[lson]=0; 15 lazy[rson]=0; 16 flag[lson]=flag[pos]; 17 flag[rson]=flag[pos]; 18 sum[lson]=(len-(len>>1))*flag[pos]; 19 sum[rson]=(len>>1)*flag[pos]; 20 flag[pos]=0; 21 } 22 if(lazy[pos]) 23 { 24 lazy[lson]+=lazy[pos]; 25 lazy[rson]+=lazy[pos]; 26 sum[lson]+=(len-(len>>1))*lazy[pos]; 27 sum[rson]+=(len>>1)*lazy[pos]; 28 lazy[pos]=0; 29 } 30 } 31 void buildtree(ll l,ll r,ll pos) 32 { 33 lazy[pos]=0; 34 flag[pos]=0; 35 ll mid=(l+r)>>1; 36 if(l==r) 37 { 38 scanf("%lld",&sum[pos]); 39 return; 40 } 41 buildtree(l,mid,pos*2); 42 buildtree(mid+1,r,pos*2+1); 43 sum[pos]=sum[pos*2]+sum[pos*2+1]; 44 } 45 ll query(ll L,ll R,ll l,ll r,ll pos) 46 { 47 pushdown(pos,r-l+1); 48 if(L<=l&&r<=R) 49 return sum[pos]; 50 ll mid=(l+r)>>1; 51 ll ans=0; 52 if(L<=mid) ans+=query(L,R,l,mid,pos*2); 53 if(mid<R) ans+=query(L,R,mid+1,r,pos*2+1); 54 return ans; 55 } 56 void update(ll L,ll R,ll c,ll l,ll r,ll pos,ll gg) 57 { 58 pushdown(pos,(r-l+1)); 59 if(L<=l&&r<=R) 60 { 61 if(gg) 62 flag[pos]=c,sum[pos]=(c*(r-l+1)); 63 else 64 lazy[pos]+=c,sum[pos]+=(c*(r-l+1)); 65 return; 66 } 67 ll mid=(l+r)>>1; 68 if(L<=mid)update(L,R,c,l,mid,pos*2,gg); 69 if(mid<R)update(L,R,c,mid+1,r,pos*2+1,gg); 70 sum[pos]=sum[pos*2]+sum[pos*2+1]; 71 } 72 int main() 73 { 74 ll x,y,z,i,t; 75 while(~scanf("%lld%lld",&x,&y)) 76 { 77 buildtree(1,x+1,1); 78 for(i=0;i<y;i++) 79 { 80 ll hh,l,r,change; 81 scanf("%lld%lld%lld%lld",&hh,&l,&r,&change); 82 update(l+1,r+1,change,1,x+1,1,hh); 83 printf("%lld ",query(1,x+1,1,x+1,1)); 84 } 85 } 86 return 0; 87 }