I would like to go to the first pass plus ...
#include <iostream>#include<cstdio>#include<cstring>#defineMAXN 100500using namespacestd;Long Longls[maxn<<2],rs[maxn<<2],val[maxn<<2],lazy1[maxn<<2],lazy2[maxn<<2];Long Longn,p,m,a,b,c,d,w[maxn],tot=0, Root;voidPushup (Long LongNow ) {Val[now]= (Val[ls[now]]+val[rs[now]])%p;}voidBuildLong Long&now,Long LongLeftLong LongRight ) { Now=++tot;lazy1[now]=0; lazy2[now]=1; if(left==Right ) {Val[now]=w[left]%Q; return; } Long LongMid= (left+right) >>1; Build (Ls[now],left,mid); Build (Rs[now],mid+1, right); Pushup (now);}voidPushdown (Long LongNowLong LongLeftLong LongRight ) { Long LongMid= (left+right) >>1; Lazy1[ls[now]]= (Lazy1[ls[now]]*lazy2[now]+lazy1[now])%p; Lazy1[rs[now]]= (Lazy1[rs[now]]*lazy2[now]+lazy1[now])%p; Lazy2[ls[now]]= (Lazy2[ls[now]]*lazy2[now])%p; Lazy2[rs[now]]= (Lazy2[rs[now]]*lazy2[now])%p; Val[ls[now]]= (val[ls[now]]*lazy2[now]+lazy1[now]* (mid-left+1))%p; Val[rs[now]]= (val[rs[now]]*lazy2[now]+lazy1[now]* (right-mid))%p; Lazy1[now]=0; lazy2[now]=1;}voidModifyLong LongNowLong LongLeftLong LongRightLong LongLLong LongRLong LongTypeLong Longx) {pushdown (now,left,right); if((left==l) && (right==r)) {if(type==1) {lazy1[now]+=x;lazy1[now]%=p;val[now]+=x* (right-left+1); val[now]%=p;} Else{lazy2[now]*=x;lazy2[now]%=p;lazy1[now]*=x;lazy1[now]%=p;val[now]*=x;val[now]%=p;} return; } Long LongMid= (left+right) >>1; if(r<=mid) Modify (LS[NOW],LEFT,MID,L,R,TYPE,X); Else if(l>=mid+1) Modify (rs[now],mid+1, right,l,r,type,x); Else{Modify (ls[now],left,mid,l,mid,type,x); Modify (Rs[now],mid+1, right,mid+1, r,type,x); } pushup (now);}Long LongAskLong LongNowLong LongLeftLong LongRightLong LongLLong LongR) {pushdown (now,left,right); if((left==l) && (right==R))returnval[now]%p; Long LongMid= (left+right) >>1; if(R<=mid)returnAsk (ls[now],left,mid,l,r)%p; Else if(l>=mid+1)returnAsk (rs[now],mid+1, right,l,r)%p; Else return(Ask (Ls[now],left,mid,l,mid) +ask (rs[now],mid+1, right,mid+1, R))%p;}voidWork1 () {scanf ("%lld%lld%lld",&b,&c,&d); Modify (Root,1, N,b,c,2, D);}voidWork2 () {scanf ("%lld%lld%lld",&b,&c,&d); Modify (Root,1, N,b,c,1, D);}voidWork3 () {scanf ("%lld%lld",&b,&c); printf ("%lld\n", Ask (Root,1, n,b,c)%p);}intMain () {scanf ("%lld%lld",&n,&p); for(Long LongI=1; i<=n;i++) scanf ("%lld",&W[i]); Build (Root,1, N); scanf ("%lld",&m); for(Long LongI=1; i<=m;i++) {scanf ("%lld",&a); if(a==1) Work1 (); Else if(a==2) Work2 (); ElseWork3 (); } return 0;}
Bzoj 1798 Maintenance sequence