rt,模板2 模板2
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,op;
int p;
struct Node{
int l,r,len;
long long sum;
int lazy,lazy2;
//lazy加tag,lazy2乘tag
}a[N*4];
void pushdown(int x){
if(a[x].lazy||a[x].lazy2){
a[x*2].sum+=a[x].lazy*a[x].len+a[x].lazy2*a[x*2].sum;
a[x*2].sum%=p;
a[x*2+1].sum+=a[x].lazy*a[x].len+a[x].lazy2*a[x*2+1].sum;
a[x*2+1].sum%=p;
a[x*2].lazy2*=a[x].lazy2;
a[x*2].lazy2%=p;
a[x*2+1].lazy2*=a[x].lazy2;
a[x*2+1].lazy2%=p;
a[x*2].lazy+=(a[x].lazy+a[x*2].lazy*a[x].lazy2);
a[x*2+1].lazy+=(a[x].lazy+a[x*2+1].lazy*a[x].lazy2);
a[x].lazy=0;
a[x].lazy2=1;
//应该好懂的
}
}
void bulid(int x,int l,int r){
a[x].l=l;
a[x].r=r;
a[x].len=l+r-1;
if(l==r){
scanf("%d",&a[x].sum);
return;
}
int mid=(l+r)>>1;
bulid(x*2,l,mid);
bulid(x*2+1,mid+1,r);
a[x].sum=a[x*2].sum+a[x*2+1].sum;
}
void add(int x,int l,int r,int o){
if(a[x].l<=l&&r>=a[x].r){
a[x].sum+=o*a[x].len;
a[x].sum%=p;
a[x].lazy+=o;
a[x].lazy%=p;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(l<=mid) add(x*2,l,r,o);
if(r>=mid) add(x*2+1,l,r,o);
a[x].sum=a[x*2].sum+a[x*2+1].sum;
a[x].sum%=p;
}
void mul(int x,int l,int r,int o){
if(a[x].l<=l&&r>=a[x].r){
a[x].sum*=o;
a[x].sum%=p;
a[x].lazy*=o;
a[x].lazy%=p;
a[x].lazy2*=o;
a[x].lazy2%=p;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(l<=mid) mul(x*2,l,r,o);
if(r>=mid) mul(x*2+1,l,r,o);
a[x].sum=a[x*2].sum+a[x*2+1].sum;
a[x].sum%=p;
}
long long ask(int x,int l,int r){
if(l<=a[x].l&&a[x].r<=r){
return a[x].sum;
}
pushdown(x);
int mid=(a[x].l+a[x].r)>>1;
long long t=0;
if(l<=mid){
t+=ask(x*2,l,r);
t%=p;
}
if(r>mid){
t+=ask(x*2+1,l,r);
t%=p;
}
return t;
}
int main(){
cin>>n>>m>>p;
bulid(1,1,n);
int x,y,k;
while(m--){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
scanf("%d",&k);
mul(1,x,y,k);
}
else if(op==2){
scanf("%d",&k);
add(1,x,y,k);
}
else{
printf("%lld\n",ask(1,x,y));
}
}
return 0;
}