#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int N=1e5+10;
struct node{
int l,r;
int pre,add;
int add2;
}t[N<<2];
int n,m,mod;
int a[N];
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;
t[p].add2=1;
t[p].add=0;
if(l==r){
t[p].pre=a[l]%mod;
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].pre=(t[p<<1].pre+t[p<<1|1].pre)%mod;
}
void spread(int p){
t[p<<1].pre=(t[p<<1].pre*t[p].add2+(t[p<<1].add*t[p].add2*(t[p<<1].r-t[p<<1].l+1))%mod)%mod;
t[p<<1|1].pre=(t[p<<1|1].pre*t[p].add2+(t[p<<1|1].add*t[p].add2*(t[p<<1|1].r-t[p<<1|1].l+1))%mod)%mod;
t[p<<1].add2=t[p<<1].add2*t[p].add2%mod;
t[p<<1|1].add2=t[p<<1|1].add2*t[p].add2%mod;
t[p<<1].add=(t[p<<1].add*t[p].add2+t[p].add)%mod;
t[p<<1|1].add=(t[p<<1|1].add*t[p].add2+t[p].add)%mod;
t[p].add=0;
t[p].add2=1;
return;
}
void change(int p,int x,int y,int k){
int l=t[p].l,r=t[p].r;
if(l>=x&&r<=y){
t[p].add=(t[p].add+k)%mod;
t[p].pre=(t[p].pre+(r-l+1)*k)%mod;
return;
}
spread(p);
t[p].pre=t[p<<1].pre+t[p<<1|1].pre;
int mid=(l+r)>>1;
if(mid>=x){
change(p<<1,x,y,k);
}
if(mid<y){
change(p<<1|1,x,y,k);
}
t[p].pre=(t[p<<1].pre+t[p<<1|1].pre)%mod;
return;
}
void chg2(int p,int x,int y,int k){
int l=t[p].l,r=t[p].r;
if(l>=x&&r<=y){
t[p].add=(t[p].add*k)%mod;
t[p].add2=(t[p].add2*k)%mod;
t[p].pre=(t[p].pre*k)%mod;
return;
}
spread(p);
t[p].pre=t[p<<1].pre+t[p<<1|1].pre;
int mid=(l+r)>>1;
if(mid>=x){
chg2(p<<1,x,y,k);
}
if(mid<y){
chg2(p<<1|1,x,y,k);
}
t[p].pre=(t[p<<1].pre+t[p<<1|1].pre)%mod;
return;
}
int ask(int p,int x,int y){
int l=t[p].l,r=t[p].r;
if(l>=x&&r<=y){
return t[p].pre;
}
spread(p);
int ans=0,mid=l+r>>1;
if(mid>=x){
ans=(ans+ask(p<<1,x,y))%mod;
}if(mid<y){
ans=(ans+ask(p<<1|1,x,y))%mod;
}
return ans;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
int t,x,y,k;
for(int i=1;i<=m;i++){
scanf("%lld",&t);
if(t==1){
scanf("%lld%lld%lld",&x,&y,&k);
change(1,x,y,k);
}else if(t==2){
scanf("%lld%lld%lld",&x,&y,&k);
chg2(1,x,y,k);
}else{
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(1,x,y)%mod);
}
}
return 0;
}
样例输出
14
2