1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include <bits/stdc++.h> using namespace std; #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define int long long const int N=1e5+10; int a[N],t[N<<2],mu[N<<2],sum[N<<2]; #define ls 2*x #define rs 2*x+1 #define mid ((l+r)/2) int n,m,mod; void pushup(int x){ t[x]=(t[ls]+t[rs])%mod; } void pushdown(int x,int l,int r){ t[ls]=(t[ls]*mu[x]+sum[x]*(mid-l+1))%mod; t[rs]=(t[rs]*mu[x]+sum[x]*(r-mid))%mod; mu[ls]=(mu[ls]*mu[x])%mod; mu[rs]=(mu[rs]*mu[x])%mod; sum[ls]=(sum[ls]*mu[x]+sum[x])%mod; sum[rs]=(sum[rs]*mu[x]+sum[x])%mod; mu[x]=1; sum[x]=0; } void build(int x,int l,int r){ mu[x]=1; sum[x]=0; if(l==r){ t[x]=a[l]; return; } build(ls,l,mid); build(rs,mid+1,r); pushup(x); } void mult(int x,int l,int r,int L,int R,int c){ if(l>=L&&r<=R){ mu[x]=(mu[x]*c)%mod; sum[x]=(sum[x]*c)%mod; t[x]=(t[x]*c)%mod; return; } pushdown(x,l,r); if(L<=mid)mult(ls,l,mid,L,R,c); if(mid<R)mult(rs,mid+1,r,L,R,c); pushup(x); } void add(int x,int l,int r,int L,int R,int c){ if(l>=L&&r<=R){ sum[x]=(sum[x]+c)%mod; t[x]=(t[x]+c*(r-l+1))%mod; return ; } pushdown(x,l,r); if(L<=mid)add(ls,l,mid,L,R,c); if(mid<R)add(rs,mid+1,r,L,R,c); pushup(x); } int query(int x,int l,int r,int L,int R){ if(l>=L&&r<=R){ return t[x]; } pushdown(x,l,r); int ret=0; if(L<=mid)ret+=query(ls,l,mid,L,R); if(mid<R)ret+=query(rs,mid+1,r,L,R); return ret%mod; } signed main(){ IOS cin>>n>>m>>mod; for(int i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); while(m--){ int op,l,r,c; cin>>op>>l>>r; if(op==1){ cin>>c; mult(1,1,n,l,r,c); }else if(op==2){ cin>>c; add(1,1,n,l,r,c); }else { cout<<query(1,1,n,l,r)<<'\n'; } } return 0; }
|