#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
ll x,tag1/*乘法*/,tag2;
}tree[110000];
ll s[110000],n,q,m;
void make_tree(ll id,ll l,ll r){
tree[id].tag1=1;
if(l==r){
tree[id].x=s[l];
tree[id].x%=m;
return;
}
ll mid=(l+r)>>1;
make_tree(id*2,l,mid);
make_tree(id*2+1,mid+1,r);
tree[id].x=tree[id*2].x+tree[id*2+1].x;
tree[id].x%=m;
}
void make_tag(ll id,ll l,ll r){
ll mid=(l+r)>>1;
tree[id*2].x=(tree[id].tag1%m*tree[id*2].x%m)%m+(tree[id].tag2%m*(mid-l+1)%m)%m;
tree[id*2+1].x=(tree[id].tag1%m*tree[id*2+1].x%m)%m+(tree[id].tag2%m*(r-mid)%m)%m;
tree[id*2].tag1=(tree[id].tag1%m*tree[id*2].tag1%m)%m;
tree[id*2+1].tag1=(tree[id].tag1%m*tree[id*2+1].tag1%m)%m;
tree[id*2].tag2=(tree[id].tag1%m*tree[id*2].tag2%m+tree[id*2].tag1%m)%m;
tree[id*2+1].tag2=(tree[id].tag1%m*tree[id*2+1].tag2%m+tree[id*2+1].tag1%m)%m;
tree[id].tag1=1;
tree[id].tag2=0;
}
void chen(ll id,ll l,ll r,ll l_,ll r_,ll k){
if(l_<=l&&r<=r_){
tree[id].x=(tree[id].x%m*k%m)%m;
tree[id].tag1=(tree[id].tag1%m*k%m)%m;
tree[id].tag2=(tree[id].tag2%m*k%m)%m;
return;
}
if(tree[id].tag1!=1)
make_tag(id,l,r);
if(tree[id].tag2)
make_tag(id,l,r);
ll mid=(l+r)>>1;
if(mid<r_)
chen(id*2+1,mid+1,r,l_,r_,k);
if(mid>=l_)
chen(id*2,l,mid,l_,r_,k);
tree[id].x=tree[id*2].x+tree[id*2+1].x;
tree[id].x%=m;
}
void add(ll id,ll l,ll r,ll l_,ll r_,ll k){
// cout<<id<<' '<<l<<' '<<r<<' '<<l_<<' '<<r_<<' '<<k<<'\n';
if(l_<=l&&r<=r_){
tree[id].x=(r-l+1)*k%m;
tree[id].tag2=(tree[id].tag1%m*tree[id].tag2%m+tree[id].x%m)%m;
return;
}
if(tree[id].tag1!=1)
make_tag(id,l,r);
if(tree[id].tag2)
make_tag(id,l,r);
ll mid=(l+r)>>1;
if(mid<r_)
add(id*2+1,mid+1,r,l_,r_,k);
if(mid>=l_)
add(id*2,l,mid,l_,r_,k);
tree[id].x=tree[id*2].x+tree[id*2+1].x;
tree[id].x%=m;
}
ll find(ll id,ll l,ll r,ll l_,ll r_){
// cout<<id<<' '<<l<<' '<<r<<' '<<l_<<' '<<r_<<'\n';
if(l_<=l&&r<=r_)
return tree[id].x%m;
if(tree[id].tag1!=1)
make_tag(id,l,r);
if(tree[id].tag2)
make_tag(id,l,r);
ll sum=0,mid=(l+r)>>1;
if(mid<r_)
sum+=find(id*2+1,mid+1,r,l_,r_)%m;
if(mid>=l_)
sum+=find(id*2,l,mid,l_,r_)%m;
return sum%m;
}
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
cin>>s[i];
make_tree(1,1,n);
while(q--){
ll op,l,r,k;
cin>>op;
if(op==1){
cin>>l>>r>>k;
chen(1,1,n,l,r,k);
}
else if(op==2){
cin>>l>>r>>k;
add(1,1,n,l,r,k);
}
else{
cin>>l>>r;
cout<<find(1,1,n,l,r)<<'\n';
}
}
return 0;
}
样例没过,不会。。。。。。刚学