RT,代码不难看
#include<bits/stdc++.h>
#define int long long
#define N 100009
using namespace std;
int n,m,p,a[N];
struct Node{
int sum,add,mul,l,r;
}tr[N*4];
void pushup(int u){
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
tr[u].sum%=p;
}
void eval(Node t,int add,int mul){
t.sum=(t.sum*mul+(t.r-t.l+1)*add)%p;
t.mul=t.mul*mul%p;
t.add=(t.add*mul+add)%p;
}
void pushdown(int u){
eval(tr[u<<1],tr[u].add,tr[u].mul);
eval(tr[u<<1|1],tr[u].add,tr[u].mul);
tr[u].add=0,tr[u].mul=1;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r,tr[u].add=0,tr[u].mul=1;
if(l==r){
tr[u].sum=a[l];
return ;
}
tr[u].sum=0;
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,int add,int mul){
if(tr[u].l>=l&&tr[u].r<=r){
eval(tr[u],add,mul);
return ;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid){
modify(u<<1,l,r,add,mul);
}
if(r>mid){
modify(u<<1|1,l,r,add,mul);
}
pushup(u);
}
int query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].sum;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1,ans=0;
if(l<=mid){
ans+=query(u<<1,l,r);
}
if(r>mid){
ans+=query(u<<1|1,l,r);
ans%=p;
}
return ans;
}
signed main(){
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
cin>>m;
for(int i=1;i<=m;i++){
int t,l,r,x;
cin>>t>>l>>r;
if(t==1){
cin>>x;
modify(1,l,r,0,x);
}
else if(t==2){
cin>>x;
modify(1,l,r,x,1);
}
else cout<<query(1,l,r)<<endl;
}
return 0;
}