RT
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100001;
int n,m,p,a[N];
struct node{
ll v,mt,at;
}tree[N*4];
inline int ls(int i){
return i<<1;
}
inline int rs(int i){
return i<<1|1;
}
inline void build(int i,int l,int r){
tree[i].mt=1,tree[i].at=0;
if(l==r){
tree[i].v=a[l];
tree[i].v%=p;
return;
}
int mid=l+r>>1;
build(ls(i),l,mid);
build(rs(i),mid+1,r);
tree[i].v=tree[ls(i)].v+tree[rs(i)].v;
tree[i].v%=p;
}
inline void push_down(int i,int l,int r){
int mid=l+r>>1;
tree[ls(i)].v=(tree[ls(i)].v*tree[i].mt+tree[i].at*(mid-l+1))%p;
tree[rs(i)].v=(tree[rs(i)].v*tree[i].mt+tree[i].at*(r-mid))%p;
tree[ls(i)].mt=(tree[ls(i)].mt*tree[i].mt)%p;
tree[rs(i)].mt=(tree[rs(i)].mt*tree[i].mt)%p;
tree[ls(i)].at=(tree[ls(i)].at*tree[i].mt+tree[i].at)%p;
tree[rs(i)].at=(tree[rs(i)].at*tree[i].mt+tree[i].at)%p;
tree[i].mt=1;
tree[i].at=0;
}
inline void udml(int i,int nl,int nr,int l,int r,ll k){
if(l>nr || r<nl) return;
if(l<=nl && nr<=r){
tree[i].v=(tree[i].v*k)%p;
tree[i].mt=(tree[i].mt*k)%p;
tree[i].at=(tree[i].at*k)%p;
return;
}
push_down(i,nl,nr);
int mid=nl+nr>>1;
udml(ls(i),nl,mid,l,r,k);
udml(rs(i),mid+1,nr,l,r,k);
tree[i].v=(tree[ls(i)].v+tree[rs(i)].v)%p;
}
inline void udad(int i,int nl,int nr,int l,int r,ll k){
if(l>nr || r<nl) return;
if(l<=nl && nr<=r){
tree[i].at=(tree[i].at*k)%p;
tree[i].v=(tree[i].v+k*(nr-nl+1))%p;
return;
}
push_down(i,nl,nr);
int mid=nl+nr>>1;
udad(ls(i),nl,mid,l,r,k);
udad(rs(i),mid+1,nr,l,r,k);
tree[i].v=(tree[ls(i)].v+tree[rs(i)].v)%p;
}
inline ll query(int i,int nl,int nr,int l,int r){
if(l>nr || r<nl) return 0;
if(l<=nl && nr<=r)
return tree[i].v;
push_down(i,nl,nr);
int mid=nl+nr>>1;
return (query(ls(i),nl,mid,l,r)+query(rs(i),mid+1,nr,l,r));
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;++i) cin>>a[i];
build(1,1,n);
while(m--){
int opt,l,r,k;
cin>>opt>>l>>r;
if(opt==1){
cin>>k;
udml(1,1,n,l,r,k);
}
if(opt==2){
cin>>k;
udad(1,1,n,l,r,k);
}
if(opt==3){
cout<<query(1,1,n,l,r)<<endl;
}
}
}
全WA,就是很迷惑(萌新见谅)