cf438d the child and Sequence
Given series, interval query and, interval modulus, single point modification.
N,m less than 10^5
The difficulty lies in the interval modulus, similar to the interval root, if the maximum value of this interval is $<=$ $mod $, do not operate, and vice versa to operate on each number in the interval (due to the small number of operands)
Open $long long$
#include <bits/stdc++.h>#defineN 1000000#defineLL Long Longusing namespacestd;structnode{LL L,R,W,F,MAXN;} Tr[n];voidpush_up (LL k) {TR[K].MAXN=max (tr[k<<1].maxn,tr[k<<1|1].MAXN); TR[K].W=tr[k<<1].w+tr[k<<1|1].W;}voidBuild (LL k,ll l,ll r) {TR[K].L=l,tr[k].r=R; if(l==R) {scanf ("%d",&TR[K].W); TR[K].MAXN=TR[K].W; return; } LL Mid= (l+r) >>1; Build (k<<1, L,mid); Build (k<<1|1, mid+1, R); Push_up (k);}voidPush_down (LL k) {if(TR[K].F) {tr[k<<1].w+=tr[k].f* (tr[k<<1].r-tr[k<<1].l+1); Tr[k<<1].f+=tr[k].f,tr[k<<1].maxn+tr[k].f; Tr[k<<1|1].w+=tr[k].f* (tr[k<<1|1].r-tr[k<<1|1].l+1); Tr[k<<1|1].f+=tr[k].f,tr[k<<1|1].maxn+tr[k].f; TR[K].F=0; }}voidChange (ll k,ll ql,ll qr,ll mod,ll x) {ll L=tr[k].l,r=tr[k].r,mid= (l+r) >>1; if(l==R) { if(! Mod) tr[k].w=tr[k].maxn=x; Elsetr[k].w%=mod,tr[k].maxn=TR[K].W; return; }push_down (k); if(ql<=mid&&tr[k<<1].maxn>=mod) Change (k<<1, ql,qr,mod,x); if(qr>mid&&tr[k<<1|1].maxn>=mod) Change (k<<1|1, ql,qr,mod,x); Push_up (k);} ll query (ll k,ll ql,ll qr) {ll L=tr[k].l,r=tr[k].r,mid= (l+r) >>1; if(QL<=L&&QR>=R)returnTR[K].W; Push_down (k); LL ans=0; if(Ql<=mid) Ans+=query (k<<1, QL,QR); if(Qr>mid) Ans+=query (k<<1|1, QL,QR); Push_up (k); returnans;} LL n,m;intMain () {scanf ("%lld%lld",&n,&m); Build (1,1, N); for(LL opt,l,r,x,i=1; i<=m;i++) {scanf ("%lld%lld%lld",&opt,&l,&R); if(opt==1) {printf ("%lld\n", Query (1, L,r)); }Else if(opt==2) {scanf ("%lld",&x); Change (1, L,r,x,0); }Else if(opt==3) {Change (1Dll0, R); } } return 0;}
cf438d the child and Sequence