#1#2#3...→#10[WA]
先%%%DALAO
#include<bits/stdc++.h>
#define int long long
#define _ %P
#define endl '\n'
#define reset t[id].add=0;t[id].mul=1
using namespace std;
int P;
inline int read(){
int res=0,f=1;
char ch=getchar();
while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)){ res=res*10+ch-48; ch=getchar();}
return res*f;
}
const int maxn=100000+10;
struct Node{
int L,R;
int sum,add,mul;
} t[maxn*4+1];
int n,a[maxn];
void up(int id){
t[id].sum=t[id*2].sum+t[id*2+1].sum;
}
void down(int id){//处理编号id的为标记,下传给它的儿子
//LEFTs_id=id*2
//RIGHTs_id=id*2+1
t[id*2].add=t[id*2].add*t[id].mul+t[id].add;
t[id*2+1].add=t[id*2+1].add*t[id].mul+t[id].add;
t[id*2].sum=(t[id*2].sum*t[id].mul+(t[id*2].R-t[id*2].L+1)*t[id].add _)_;
t[id*2+1].sum=(t[id*2+1].sum*t[id].mul+(t[id*2+1].R-t[id*2+1].L+1)*t[id].add _)_;
t[id*2].mul*=t[id].mul;
t[id*2+1].mul*=t[id].mul;
reset;
}
void build(int id,int l,int r){//新建一个节点,编号为id,左端点为l,右端点为r
t[id].L=l; t[id].R=r;
if(l==r){//节点表示的区间为一个点,递归边界
t[id].sum=a[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid); build(id*2+1,mid+1,r);
up(id);
}
void update(int id,int l,int r,int val,string s){//将l,r区间同时加上一个val
if(s=="mul"){//mul标记
if(t[id].L>r || t[id].R<l) return;
if(t[id].L>=l && t[id].R<=r){//节点自己处理
t[id].add*=val;t[id].add _;
t[id].mul*=val;t[id].mul _;
t[id].sum*=val;t[id].sum _;
return;
}
down(id);
t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
int mid=(t[id].R+t[id].L)>>1;
if(l<=mid)update(id*2,l,r,val,s);
if(mid<r)update(id*2+1,l,r,val,s);
t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
}
else{//add标记
if(t[id].L>r || t[id].R<l) return;
if(t[id].L>=l && t[id].R<=r){//节点自己处理
t[id].add+=val;t[id].add _;
t[id].sum+=(t[id].R-t[id].L+1)*val;t[id].sum _;
return;
}
down(id);
t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
int mid=(t[id].R+t[id].L)>>1;
if(l<=mid)update(id*2,l,r,val,s);
if(mid<r)update(id*2+1,l,r,val,s);
t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
}
}
int ask_sum(int id,int l,int r){
if(t[id].L>r || t[id].R<l) return 0;
if(t[id].L>=l && t[id].R<=r) return t[id].sum;
down(id);
return (ask_sum(id*2,l,r)+ask_sum(id*2+1,l,r)) _;
}
signed main(){
int m,opt,l,r,val;
cin>>n>>P;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
build(1,1,n);//
while(m--){
cin>>opt;
if(opt==1){
cin>>l>>r>>val; update(1,l,r,val,"mul");
} else if(opt==2){
cin>>l>>r>>val;
update(1,l,r,val,"add");
} else {
cin>>l>>r;
cout<<ask_sum(1,l,r)<<endl;
}
}
return 0;
}