#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int l[100005],r[100005];
int sum[100005];
int dx,sl;
int sy[100005];
int a[100005];
int la1[100005],la2[100005];
int n,m,p;
void build(){
dx=sqrt(n);
sl=n/dx;
if(n%dx) sl++;
for(int i=1;i<=sl;i++)
l[i]=(i-1)*dx+1,r[i]=i*dx;
r[sl]=n;
for(int i=1;i<=sl;i++)
for(int j=l[i];j<=r[i];j++)
sum[i]+=a[j];
for(int i=1;i<=n;i++)
sy[i]=(i-1)/dx+1;
return;
}
void add(int x,int y,int k){
if(sy[x]==sy[y]){
for(int i=x;i<=y;i++)
a[i]+=k;
sum[sy[x]]+=(y-x)*k;
}
else{
for(int i=x;i<=r[sy[x]];i++)
a[i]+=k;
sum[sy[x]]+=(r[sy[x]]-x+1)*k;
for(int i=sy[x]+1;i<=sy[y]-1;i++)
la1[i]+=k,sum[i]+=(r[i]-l[i]+1)*k;
for(int i=l[sy[y]];i<=y;i++)
a[i]+=k;
sum[sy[y]]+=(y-l[sy[y]]+1)*k;
}
return;
}
void mul(int x,int y,int k){
if(sy[x]==sy[y]){
int num=0,nu2=0;
for(int i=x;i<=y;i++)
num+=a[i],a[i]*=k,nu2+=a[i];
sum[sy[x]]+=nu2-num;
}
else{
int num=0,nu2=0;
for(int i=x;i<=r[sy[x]];i++)
num+=a[i],a[i]*=k,nu2+=a[i];
sum[sy[x]]+=nu2-num;
for(int i=sy[x]+1;i<=sy[y]-1;i++)
la2[i]+=k,la1[i]*=k,sum[i]*=k;
num=0,nu2=0;
for(int i=l[sy[y]];i<=y;i++)
num+=a[i],a[i]*=k,nu2+=a[i];
sum[sy[y]]+=nu2-num;
}
return;
}
long long anwer(int x,int y){
long long ans=0;
if(sy[x]==sy[y]){
for(int i=x;i<=y;i++)
ans+=(a[i]*la2[sy[i]]+la1[sy[i]])%p;
}
else{
for(int i=x;i<=r[sy[x]];i++)
ans=(ans+a[i]*la2[sy[i]]+la1[sy[i]])%p;
for(int i=sy[x]+1;i<=sy[y]-1;i++)
ans=(ans+sum[i])%p;
for(int i=l[sy[y]];i<=y;i++)
ans=(ans+a[i]*la2[sy[i]]+la1[sy[i]])%p;
}
return ans;
}
signed main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
la2[i]=1;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build();
int ch;
for(int i=1;i<=n;i++){
scanf("%d",&ch);
int x,y,k;
if(ch==1){
scanf("%d%d%d",&x,&y,&k);
mul(x,y,k);
}
if(ch==2){
scanf("%d%d%d",&x,&y,&k);
add(x,y,k);
}
if(ch==3){
scanf("%d%d",&x,&y);
printf("%lld\n",anwer(x,y));
}
}
return 0;
}
求助大佬,全WA。