记得开long long!!

  1 #include<bits/stdc++.h>
  2 #define ll long long
  3 using namespace std;
  4 
  5 int mod;
  6 ll n,m,a[5000001],add[5000001],mul[5000001];
  7 ll sum[5000001]; 
  8 
  9 void build(ll k,ll l,ll r)    
 10 {
 11     if (l==r)    
 12     {
 13         cin>>sum[k];
 14         sum[k]%=mod;
 15         return ;
 16     }
 17     ll mid=(l+r)>>1;
 18     build(k*2,l,mid); 
 19     build(k*2+1,mid+1,r);
 20     sum[k]=(sum[k*2]+sum[k*2+1])%mod; 
 21 }
 22 
 23 void Add(ll k,ll l,ll r,ll v)
 24 {
 25     add[k]=(add[k]+v)%mod;    
 26     sum[k]=(sum[k]+v*(r-l+1)%mod)%mod;
 27 }
 28 
 29 void Mul(ll k,ll v)
 30 {
 31     mul[k]=mul[k]%mod*v%mod;
 32     sum[k]=sum[k]%mod*v%mod;
 33     add[k]=add[k]%mod*v%mod;
 34 }
 35 
 36 void pushdown(ll k,ll l,ll r,ll mid) 
 37 {    
 38     if (mul[k]!=1)
 39     {
 40         Mul(k*2,mul[k]);     
 41         Mul(k*2+1,mul[k]);
 42         mul[k]=1;
 43     }
 44     if (add[k]!=0)    
 45     {
 46         Add(k*2,l,mid,add[k]);     
 47         Add(k*2+1,mid+1,r,add[k]);
 48         add[k]=0;
 49     }
 50 }
 51 
 52 ll query(ll k,ll l,ll r,ll x,ll y)     
 53 {
 54     if (x<=l&&r<=y)
 55         return sum[k];
 56     ll mid=(l+r)>>1;
 57     ll ans=0;
 58     pushdown(k,l,r,mid);
 59     if (x<=mid)
 60         ans=(ans+query(k*2,l,mid,x,y))%mod;
 61     if (mid<y)
 62         ans=(ans+query(k*2+1,mid+1,r,x,y))%mod;
 63     return ans;
 64 }
 65 
 66 void modify(ll k,ll l,ll r,ll x,ll y,ll v,ll op)     
 67 {
 68     if (x<=l&&r<=y)
 69     {
 70         if (op==1)
 71             return Mul(k,v);
 72         if (op==2)
 73             return Add(k,l,r,v);
 74     }
 75     ll mid=(l+r)>>1;
 76     pushdown(k,l,r,mid);    
 77     if (x<=mid)
 78         modify(k*2,l,mid,x,y,v,op);
 79     if (mid<y)
 80         modify(k*2+1,mid+1,r,x,y,v,op);
 81     sum[k]=(sum[k*2]+sum[k*2+1])%mod;  
 82 }
 83 
 84 int main()
 85 {
 86     scanf("%lld%lld%lld",&n,&m,&mod);
 87     for (ll i=1;i<=5000001;i++)
 88         mul[i]=1,add[i]=0;
 89     build(1,1,n);
 90     while (m--)
 91     {
 92         ll op,x,y,v;
 93         scanf("%lld",&op);
 94         if (op==1)     
 95         {
 96             scanf("%lld%lld%lld",&x,&y,&v);
 97             modify(1,1,n,x,y,v,1);
 98         }
 99         if (op==2)
100         {
101             scanf("%lld%lld%lld",&x,&y,&v);
102             modify(1,1,n,x,y,v,2);
103         }
104         if (op==3)    
105         {
106             scanf("%lld%lld",&x,&y);
107             printf("%lld\n",query(1,1,n,x,y)); 
108         } 
109     } 
110     return 0;
111 }