代码贴在这里
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n,m,p;
ll a[N],d[N<<2],b1[N<<2],b2[N<<2];
struct SegmentTree{
inline void build(ll u,ll l,ll r)
{
if (l==r)
{
d[u]=a[l];
return ;
}
ll mid=l+((r-l) >> 1);
build(u<<1,l,mid),build(u<<1 | 1,mid+1,r);
d[u]=d[u<<1]+d[u<<1 | 1];
}
inline void update1(ll u,ll l,ll r,ll s,ll t,ll c)
{
if (l<=s && t<=r)
{
d[u]*=c%p;d[u]%=p;b2[u]*=c;b2[u]%=p;b1[u]*=c;b1[u]%=p;
return ;
}
ll mid=s+((t-s) >> 1);
if (b2[u]!=1)
{
d[u<<1]=d[u<<1]*b2[u]%p;d[u<<1]%=p;
d[u<<1 | 1]=d[u<<1 | 1]*b2[u]%p,d[u<<1 | 1]%=p;
b2[u<<1]*=b2[u]%p,b2[u<<1 | 1]*=b2[u]%p;
b1[u<<1]*=b2[u]%p,b1[u<<1 | 1]*=b2[u]%p;
b2[u<<1]%=p,b2[u<<1 | 1]%=p;b1[u<<1]%=p;b2[u<<1 | 1]%=p;
}
b2[u]=1;
if (b1[u])
{
d[u<<1]+=(mid-s+1)*b1[u]%p;d[u<<1]%=p;
d[u<<1 | 1]+=(t-mid)*b1[u]%p;d[u<<1 | 1]%=p;
b1[u<<1]+=b1[u],b1[u<<1 | 1]+=b1[u];
b1[u<<1]%=p,b1[u<<1 | 1]%=p;
}
b1[u]=0;
if (l<=mid)
update1(u<<1,l,r,s,mid,c);
if (r>mid)
update1(u<<1 | 1,l,r,mid+1,t,c);
d[u]=(d[u<<1]+d[u<<1 | 1])%p;
}
inline void update2(ll u,ll l,ll r,ll s,ll t,ll c)
{
if (l<=s && t<=r)
{
d[u]+=(t-s+1)*c%p;d[u]%=p;b1[u]+=c;b1[u]%=p;
return ;
}
ll mid=s+((t-s) >> 1);
if (b2[u]!=1)
{
d[u<<1]=d[u<<1]*b2[u]%p;d[u<<1]%=p;
d[u<<1 | 1]=d[u<<1 | 1]*b2[u]%p,d[u<<1 | 1]%=p;
b2[u<<1]*=b2[u]%p,b2[u<<1 | 1]*=b2[u]%p;
b1[u<<1]*=b2[u]%p,b1[u<<1 | 1]*=b2[u]%p;
b2[u<<1]%=p,b2[u<<1 | 1]%=p;b1[u<<1]%=p;b2[u<<1 | 1]%=p;
}
b2[u]=1;
if (b1[u])
{
d[u<<1]+=(mid-s+1)*b1[u]%p;d[u<<1]%=p;
d[u<<1 | 1]+=(t-mid)*b1[u]%p;d[u<<1 | 1]%=p;
b1[u<<1]+=b1[u],b1[u<<1 | 1]+=b1[u];
b1[u<<1]%=p,b1[u<<1 | 1]%=p;
}
b1[u]=0;
if (l<=mid)
update2(u<<1,l,r,s,mid,c);
if (r>mid)
update2(u<<1 | 1,l,r,mid+1,t,c);
d[u]=(d[u<<1]+d[u<<1 | 1])%p;
}
inline ll getsum(ll u,ll l,ll r,ll s,ll t)
{
if (l<=s && t<=r) return d[u]%p;
ll mid=s+((t-s) >> 1);
if (b2[u]!=1)
{
d[u<<1]=d[u<<1]*b2[u]%p;d[u<<1]%=p;
d[u<<1 | 1]=d[u<<1 | 1]*b2[u]%p,d[u<<1 | 1]%=p;
b2[u<<1]*=b2[u]%p,b2[u<<1 | 1]*=b2[u]%p;
b1[u<<1]*=b2[u]%p,b1[u<<1 | 1]*=b2[u]%p;
b2[u<<1]%=p,b2[u<<1 | 1]%=p;b1[u<<1]%=p;b2[u<<1 | 1]%=p;
}
b2[u]=1;
if (b1[u])
{
d[u<<1]+=(mid-s+1)*b1[u]%p;d[u<<1]%=p;
d[u<<1 | 1]+=(t-mid)*b1[u]%p;d[u<<1 | 1]%=p;
b1[u<<1]+=b1[u],b1[u<<1 | 1]+=b1[u];
b1[u<<1]%=p,b1[u<<1 | 1]%=p;
}
b1[u]=0;
ll sum=0;
if (l<=mid)
sum+=getsum(u<<1,l,r,s,mid)%p;
sum%=p;
if (r>mid)
sum+=getsum(u<<1 | 1,l,r,mid+1,t)%p;
sum%=p;
d[u]=(d[u<<1]+d[u<<1 | 1])%p;
return sum;
}
};
inline ll read(){
ll s=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') {f=-1;} ch=getchar();}
while(isdigit(ch)) {s=(s<<1)+(s<<3)+ch-'0'; ch=getchar();}
return s*f;
}
inline void write(int x){
int top=0,sta[35];
while(x) {sta[top++]=x%10,x/=10;}
while(top) {putchar(sta[--top]+'0');}
}
int main()
{
SegmentTree segtree;
n=read();m=read(),p=read();
for (int i=1;i<=n;i++) {a[i]=read();}
for (int i=1;i<=n;i++) {b2[i]=1;}
segtree.build(1,1,n);
for (int i=1;i<=m;i++)
{
ll op=read();
if (op==1)
{
ll x=read(),y=read(),k=read();
segtree.update1(1,x,y,1,n,k);
}
else if (op==2)
{
ll x=read(),y=read(),k=read();
segtree.update2(1,x,y,1,n,k);
}
else if (op==3)
{
ll x=read(),y=read();
printf("%lld\n",segtree.getsum(1,x,y,1,n)%p);
}
}
return 0;
}