只有30分...
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,mod,val[100005],dj[500005],dc[500005],a[500005];
char ch;
// dj[] 为lazy加法,dc[]为lazy乘法
ll read(){
ll s = 0, w = 1;
ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') w = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
void jia(ll x,ll l,ll r,ll z){
dj[x] += z;
a[x] += z*(r - l + 1);
return ;
}
void cheng(ll x,ll z){
dj[x] *= z;
dc[x] *= z;
a[x] *= z;
return ;
}
void build(ll x,ll l,ll r){
dc[x] = 1;
dj[x] = 0;
if(l == r)
{
a[x] = val[l];
return ;
}
ll mid = (l + r) / 2;
build(2*x,l,mid);
build(2*x+1,mid+1,r);
a[x] = a[2*x] + a[2*x+1];
return ;
}
void pushdown(ll x,ll l,ll r,ll mid){
if(dc[x] != 1)
{
cheng(2*x,dc[x]);
cheng(2*x+1,dc[x]);
dc[x] = 1;
}
if(dj[x] != 0)
{
jia(2*x,l,mid,dj[x]);
jia(2*x+1,mid+1,r,dj[x]);
dj[x] = 0;
}
return ;
}
void xiug(ll x,ll l,ll r,ll el,ll er,ll z,ll p){
if(l == el && r == er)
{
if(p == 1)
{
cheng(x,z);
}else{
jia(x,l,r,z);
}
return ;
}
ll mid = (l + r) / 2;
pushdown(x,l,r,mid);
if(el <= mid && er > mid)
{
xiug(2*x,l,mid,el,mid,z,p);
xiug(2*x+1,mid+1,r,mid+1,er,z,p);
} else if(er <= mid)
{
xiug(2*x,l,mid,el,er,z,p);
}else
{
xiug(2*x+1,mid+1,r,el,er,z,p);
}
a[x] = a[2*x] % mod + a[2*x+1] % mod;
return ;
}
ll chax(ll x,ll l,ll r,ll el,ll er){
if(l == el && r == er)
{
return a[x] % mod;
}
ll mid = (l + r) / 2;
pushdown(x,l,r,mid);
if(el <= mid && er > mid)
{
return (chax(2*x,l,mid,el,mid) + chax(2*x+1,mid+1,r,mid+1,er)) % mod;
}else if(er <= mid)
{
return chax(2*x,l,mid,el,er);
}else
{
return chax(2*x+1,mid+1,r,el,er);
}
}
int main(){
cin >> n >> m >> mod;
for(int i = 1; i <= n; i++)
{
val[i] = read();
}
build(1,1,n);
ll l,r,p;
while(m--)
{
p = read();
if(p == 1)
{
l = read(),r = read(),p = read();
xiug(1,1,n,l,r,p,1);
} else if(p == 2)
{
l = read(),r = read(),p = read();
xiug(1,1,n,l,r,p,2);
}else
{
l = read(),r = read();
printf("%lld\n",chax(1,1,n,l,r) % mod);
}
}
return 0;
}