调了半天30分,结果。。。

P3373 【模板】线段树 2

``` #include<bits/stdc++.h> using namespace std; int mian(){ while(1){ system("title");//【坏笑】 } } ```
by OIer_Alan @ 2019-03-17 19:44:24


@[wzn789](/space/show?uid=184369) int mian可还行
by ニヒル @ 2019-03-17 19:51:17


~~我可怜的Mac就不能用万能头文件~~
by pjykk @ 2019-03-17 19:54:05


@[ニヒル](/space/show?uid=185441) signed main啊
by encore @ 2019-03-17 19:59:27


@[encore](/space/show?uid=113385) 等下我搞错了
by encore @ 2019-03-17 20:00:58


``` #define _CRT_SBCURE_NO_DEPRECATE #include<bits/stdc++.h> using namespace std; const int maxx = 1e5+6; int n,m,p; int a[maxx]; struct node{ long long sum; long long lazyadd,lazymul; }A[maxx<<2]; void build(int u,int l,int r){ A[u].lazymul=1;A[u].lazyadd=0; if(l==r) A[u].sum=a[l]; else{ int mid=(l+r)/2; build(2*u, l, mid); build(2*u+1, mid+1, r); A[u].sum=A[2*u].sum+A[2*u+1].sum; } A[u].sum%=p; return ; } void pushdown(int u, int l, int r){ int mid=(l+r)/2; A[u*2].sum=((A[u*2].sum+A[u].lazyadd*(mid-l+1))*A[u].lazymul)%p; A[u*2+1].sum=((A[u*2+1].sum+A[u].lazyadd*(r-mid))*A[u].lazymul)%p; A[u*2].lazymul=(A[u*2].lazymul*A[u].lazymul)%p; A[u*2+1].lazymul=(A[u*2+1].lazymul*A[u].lazymul)%p; A[u*2].lazyadd=(A[u*2].lazyadd*A[u].lazymul+A[u].lazyadd)%p; A[u*2+1].lazyadd=(A[u*2+1].lazyadd*A[u].lazymul+A[u].lazyadd)%p; A[u].lazymul=1; A[u].lazyadd=0; return ; } void mul(int u,int sl,int sr,int l,int r,long long k){ if(l>sr || r<sl) return ; if(l<=sl && r>=sr){ A[u].sum*=k; A[u].lazymul*=k; A[u].lazyadd*=k; A[u].sum%=p; A[u].lazymul%=p; A[u].lazyadd%=p; return ; } pushdown(u, sl, sr); int mid=(sl+sr)/2; mul(2*u, sl, mid, l, r, k); mul(2*u+1, mid+1, sr, l, r, k); A[u].sum=(A[2*u].sum+A[2*u+1].sum)%p; return ; } void add(int u,int sl,int sr,int l,int r,long long k){ if(l>sr || r<sl) return ; if(l<=sl && r>=sr){ A[u].sum+=k*(sr-sl+1); A[u].lazyadd+=k; A[u].sum%=p; A[u].lazyadd%=p; return ; } pushdown(u, sl, sr); int mid=(sl+sr)/2; add(2*u, sl, mid, l, r, k); add(2*u+1, mid+1, sr, l, r, k); A[u].sum=(A[2*u].sum+A[2*u+1].sum)%p; return ; } long long query(int u,int sl,int sr,int l,int r){ if(l>sr || r<sl) return 0; if(l<=sl && r>=sr) return A[u].sum; pushdown(u, sl, sr); int mid=(sl+sr)/2; return (query(2*u, sl, mid, l, r)+query(2*u+1, mid+1, sr, l, r))%p; } int main (){ std::ios::sync_with_stdio(false); cin>>n>>m>>p; for(int i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); while(m--){ int x,y,z; long long k; cin>>z; if(z==1){ cin>>x>>y>>k; mul(1,1,n,x,y,k); } else if(z==2){ cin>>x>>y>>k; add(1,1,n,x,y,k); } else{ cin>>x>>y; cout<<query(1,1,n,x,y)<<endl; } } return 0; } ``` ####这是代码
by OIer_Alan @ 2019-03-17 20:11:08


|