rt。
// Problem: P3373 【模板】线段树 2
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3373
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+7;
ll n,m,q,root=1;
ll a[N];
struct Node{
ll l,r,v,t,t2=1;
} tr[N<<2];
ll pushup(ll u){
tr[u].v=(tr[u<<1].v+tr[u<<1|1].v)%m;
return 0;
}
ll build(ll u,ll l,ll r){
tr[u].l=l;
tr[u].r=r;
if(l==r){
tr[u].v=a[l]%m;
return 0;
}
ll mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
return 0;
}
ll calc(ll u,ll d,ll d2){
(tr[u].v*=d2)%=m;
(tr[u].t2*=d2)%=m;
(tr[u].t*=d2)%=m;
(tr[u].v+=(tr[u].r-tr[u].l+1)*d)%=m;
(tr[u].t+=d)%=m;
return 0;
}
ll pushdown(ll u){
calc(u<<1,tr[u].t,tr[u].t2);
calc(u<<1|1,tr[u].t,tr[u].t2);
tr[u].t=0;
tr[u].t2=1;
return 0;
}
ll modify(ll u,ll l,ll r,ll v){
if(l<=tr[u].l&&tr[u].r<=r){
calc(u,v,1);
return 0;
}
ll mid=tr[u].l+tr[u].r>>1;
pushdown(u);
if(l<=mid){
modify(u<<1,l,r,v);
}
if(r>=mid+1){
modify(u<<1|1,l,r,v);
}
pushup(u);
return 0;
}
ll modify2(ll u,ll l,ll r,ll v){
if(l<=tr[u].l&&tr[u].r<=r){
calc(u,0,v);
return 0;
}
ll mid=tr[u].l+tr[u].r>>1;
pushdown(u);
if(l<=mid){
modify2(u<<1,l,r,v);
}
if(r>=mid+1){
modify2(u<<1|1,l,r,v);
}
pushup(u);
return 0;
}
ll query(ll u,ll l,ll r){
if(l<=tr[u].l&&tr[u].r<=r){
return tr[u].v;
}
ll mid=tr[u].l+tr[u].r>>1;
pushdown(u);
ll res=0;
if(l<=mid){
(res+=query(u<<1,l,r))%=m;
}
if(r>=mid+1){
(res+=query(u<<1|1,l,r))%=m;
}
return res;
}
int main()
{
cin>>n>>q>>m;
for(ll i=1;i<=n;++i){
cin>>a[i];
}
build(root,1,n);
while(q--){
ll op,l,r,k;
cin>>op>>l>>r;
if(op==1){
cin>>k;
modify(root,l,r,k);
}
if(op==2){
cin>>k;
modify2(root,l,r,k);
}
if(op==3){
cout<<query(root,l,r)<<endl;
}
}
return 0;
}
@2huk