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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,m,a[N],mod; struct ST{ long long dat[N*4]; int l[N*4],r[N*4]; long long add[N*4],mul[N*4]; void Build(int p,int ll,int rr){ add[p]=0; mul[p]=1; l[p]=ll;r[p]=rr; if(ll==rr) dat[p]=a[ll]; else{ int mid=(ll+rr)>>1; Build(p<<1,ll,mid); Build(p<<1|1,mid+1,rr); dat[p]=dat[p<<1]+dat[p<<1|1]; } dat[p]%=mod; return ; } void Spread(int p){ if(add[p]!=0||mul[p]!=1){ dat[p<<1]=(dat[p<<1]*mul[p]+add[p]*(r[p<<1]-l[p<<1]+1))%mod; dat[p<<1|1]=(dat[p<<1|1]*mul[p]+add[p]*(r[p<<1|1]-l[p<<1|1]+1))%mod; mul[p<<1]=(mul[p<<1]*mul[p])%mod; mul[p<<1|1]=(mul[p<<1|1]*mul[p])%mod; add[p<<1]=(add[p<<1]*mul[p]+add[p])%mod; add[p<<1|1]=(add[p<<1|1]*mul[p]+add[p])%mod; mul[p]=1; add[p]=0; } return ; } void Change_add(int p,int x,int y,int z){ if(x<=l[p]&&y>=r[p]){ dat[p]+=(long long)z*(r[p]-l[p]+1); dat[p]%=mod; add[p]=(add[p]+z)%mod; return ; } Spread(p); int mid=(l[p]+r[p])>>1; if(x<=mid) Change_add(p<<1,x,y,z); if(y>mid) Change_add(p<<1|1,x,y,z); dat[p]=(dat[p<<1]+dat[p<<1|1])%mod; return ; } void Change_mul(int p,int x,int y,int z){ if(x<=l[p]&&y>=r[p]){ dat[p]=(dat[p]*z)%mod; mul[p]=(mul[p]*z)%mod; add[p]=(add[p]*z)%mod; return ; } Spread(p); int mid=(l[p]+r[p])>>1; if(x<=mid) Change_mul(p<<1,x,y,z); if(y>mid) Change_mul(p<<1|1,x,y,z); dat[p]=(dat[p<<1]+dat[p<<1|1])%mod; return ; } long long Ask(int p,int x,int y){ if(x<=l[p]&&y>=r[p]) return dat[p]; Spread(p); int mid=(l[p]+r[p])>>1; long long ans=0; if(x<=mid) ans=(ans+Ask(p<<1,x,y))%mod; if(y>mid) ans=(ans+Ask(p<<1|1,x,y)); return ans%mod; } }st; int main(){ scanf("%d%d%d",&n,&m,&mod); for(int i=1;i<=n;++i) scanf("%d",&a[i]); st.Build(1,1,n); while(m--){ int q,x,y,z; scanf("%d",&q); if(q==1){ scanf("%d%d%d",&x,&y,&z); st.Change_mul(1,x,y,z); } else if(q==2){ scanf("%d%d%d",&x,&y,&z); st.Change_add(1,x,y,z); } else{ scanf("%d%d",&x,&y); printf("%lld\n",st.Ask(1,x,y)); } } return 0; }
|