#include <iostream> using namespace std; typedef long long ll; ll n,mod,a[100005], d[270000],bx[270000], b[270000];
ll wplus(ll a,ll b) { return (a+b)%mod; } ll wmul(ll a,ll b) { return (a*b)%mod; }
void build(ll l,ll r,ll p) { b[p]=0; bx[p]=1; if(l==r) { d[p]=a[l]; return; } ll m=(l+r)/2; build(l,m,p*2); build(m+1,r,p*2+1); d[p]=wplus(d[p*2],d[p*2+1]); }
void lazytag(ll s,ll t,ll p) { ll m=(s+t)/2; d[p*2]=wplus(d[p*2]*bx[p],b[p]*(m-s+1)); d[p*2+1]=wplus(d[p*2+1]*bx[p],b[p]*(t-m)); bx[p*2]=wmul(bx[p*2],bx[p]); bx[p*2+1]=wmul(bx[p*2+1],bx[p]); b[p*2]=wplus(b[p*2]*bx[p],b[p]); b[p*2+1]=wplus(b[p*2+1]*bx[p],b[p]); b[p]=0; bx[p]=1; }
void update_add(ll l,ll r,ll c,ll s,ll t,ll p) { if(l<=s&&t<=r) { b[p]=wplus(b[p],c); d[p]=wplus(d[p],(t-s+1)*c); return; } ll m=(s+t)/2; lazytag(s,t,p); if(l<=m)update_add(l,r,c,s,m,p*2); if(r>m)update_add(l,r,c,m+1,t,p*2+1); d[p]=wplus(d[p*2],d[p*2+1]); }
void update_mul(ll l,ll r,ll c,ll s,ll t,ll p) { if(l<=s&&t<=r) { bx[p]=wmul(bx[p],c); b[p]=wmul(b[p],c); d[p]=wmul(d[p],c); return; } ll m=(s+t)/2; lazytag(s,t,p); if(l<=m)update_mul(l,r,c,s,m,p*2); if(r>m)update_mul(l,r,c,m+1,t,p*2+1); d[p]=wplus(d[p*2],d[p*2+1]); }
ll getsum(ll l,ll r,ll s,ll t,ll p) { if (l<=s&&t<=r)return d[p]; ll m=(s+t)/2; lazytag(s,t,p); ll sum=0; if(l<=m)sum+=getsum(l,r,s,m,p*2)%mod; if(r>m)sum+=getsum(l,r,m+1,t,p*2+1)%mod; return sum%mod; }
int main() { ll q,i1,i2,i3,i4; cin>>n>>q>>mod; for(ll i=1; i<=n; i++)cin>>a[i]; build(1,n,1); while(q--) { cin>>i1>>i2>>i3; if (i1==3) cout<<getsum(i2,i3,1,n,1)<<endl; else if(i1==2) cin>>i4,update_add(i2,i3,i4,1,n,1); else cin>>i4,update_mul(i2,i3,i4,1,n,1); } return 0; }
|