RT,实在是找不出来了(悲
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
int val,mul,add;
}tree[400005];
int a[100005],n,q,m;
inline int ls(int p){
return p<<1;
}
inline int rs(int p){
return p<<1|1;
}
inline void pushup(int p){
tree[p].val=tree[ls(p)].val+tree[rs(p)].val;
}
inline void pushdown(int l,int r,int p){
int mid=l+r>>1;
tree[ls(p)].val*=tree[p].mul;
tree[ls(p)].val+=tree[p].add*(mid-l+1);
tree[ls(p)].add*=tree[p].mul;
tree[ls(p)].mul*=tree[p].mul;
tree[ls(p)].add+=tree[p].add;
tree[ls(p)].val%=m;
tree[ls(p)].add%=m;
tree[ls(p)].mul%=m;
tree[rs(p)].val*=tree[p].mul;
tree[rs(p)].val+=tree[p].add*(r-mid);
tree[rs(p)].add*=tree[p].mul;
tree[rs(p)].mul*=tree[p].mul;
tree[rs(p)].add+=tree[p].add;
tree[rs(p)].val%=m;
tree[rs(p)].add%=m;
tree[rs(p)].mul%=m;
tree[p].add=0;
tree[p].mul=1;
}
inline void build(int l,int r,int p){
tree[p].mul=1;
tree[p].add=0;
if(l==r){
tree[p].val=a[l];
return;
}
int mid=l+r>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
}
inline void update1(int l,int r,int ql,int qr,int p,int k){
if(l>qr||r<ql){
return;
}
if(qr>=r&&ql<=l){
tree[p].val*=k;
tree[p].val%=k;
tree[p].add*=k;
tree[p].add%=k;
tree[p].mul*=k;
tree[p].mul%=k;
return;
}
int mid=l+r>>1;
pushdown(l,r,p);
update1(l,mid,ql,qr,ls(p),k);
update1(mid+1,r,ql,qr,rs(p),k);
pushup(p);
}
inline void update2(int l,int r,int ql,int qr,int p,int k){
if(l>qr||r<ql){
return;
}
if(qr>=r&&ql<=l){
tree[p].val+=k*(r-l+1);
tree[p].add+=k;
tree[p].val%=m;
tree[p].add%=m;
return;
}
int mid=l+r>>1;
pushdown(l,r,p);
update2(l,mid,ql,qr,ls(p),k);
update2(mid+1,r,ql,qr,rs(p),k);
pushup(p);
}
inline int query(int l,int r,int ql,int qr,int p){
if(l>qr||r<ql)return 0;
if(qr>=r&&ql<=l){
return tree[p].val;
}
if(l==r)return tree[p].val;
pushdown(l,r,p);
int mid=l+r>>1;
return query(l,mid,ql,qr,ls(p))+query(mid+1,r,ql,qr,rs(p));
}
signed main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
while(q--){
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
update1(1,n,x,y,1,k);
}
else if(op==2){
int x,y,k;
cin>>x>>y>>k;
update2(1,n,x,y,1,k);
}
else{
int x,y;
cin>>x>>y;
cout<<query(1,n,x,y,1)%m<<endl;
}
}
return 0;
}