Sure enough or recursive segment tree good understanding Ah, wrote a template problem, with the Huang long template. Codevs the line tree Exercise 3.
Code:
#include"iostream"#include"Cstdio"using namespacestd;structnode{intS,t,sum,lab;} tr[800001];intn,q;inta[200001];intRead () {CharC=GetChar (); intA=0; while(c<'0'|| C>'9') c=GetChar (); while(c>='0'&&c<='9') {a=a*Ten+c-'0'; C=GetChar (); } returnA;}voidBuildintKintXinty) {TR[K].S=x;tr[k].t=y; if(x==y) {tr[k].sum=a[x];return; } intMid= (x+y) >>1; Build (k<<1, X,mid); Build (k<<1|1, mid+1, y); Tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;}voidPushdown (intk) { intx=tr[k].t-tr[k].s+1; Tr[k<<1].lab+=Tr[k].lab; Tr[k<<1|1].lab+=Tr[k].lab; Tr[k<<1].sum+= (x (x>>1))*Tr[k].lab; Tr[k<<1|1].sum+= (x>>1)*Tr[k].lab; Tr[k].lab=0;}voidChangeintNowintXintYintk) { intL=tr[now].s,r=tr[now].t; if(X==l && y==r) {Tr[now].lab+=K; Tr[now].sum+ = (y-x+1)*K; return; } if(Tr[now].lab) pushdown (now); intMid= (l+r) >>1; if(x>mid) Change (now<<1|1, x,y,k); Else if(y<=mid) Change (now<<1, x,y,k); Else{Change (now<<1, x,mid,k); Change (now<<1|1, mid+1, y,k); } tr[now].sum=tr[now<<1].sum+tr[now<<1|1].sum; return;}Long LongAskintNowintXinty) { intL=tr[now].s,r=tr[now].t; if(X==l && y==r)returntr[now].sum; if(Tr[now].lab) pushdown (now); intMid= (l+r) >>1; if(X>mid)returnAsk (now<<1|1, x, y); Else if(Y<=mid)returnAsk (now<<1, x, y); Else return(Ask (now<<1, X,mid) +ask (now<<1|1, mid+1, y)); }intMain () {n=read (); for(intI=1; i<=n; i++) a[i]=read (); Build (1,1, N); Q=read (); for(intI=1; i<=q; i++) { intnow=read (); if(now==1) { intX=read (), Y=read (), k=read (); Change (1, x,y,k); } Else if(now==2) { intX=read (), y=read (); printf ("%lld\n", Ask (1, x, y)); } } return 0;}
Back | segment tree with markers