Code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,inf=1e18;
int n,q;
int a[N],tmin[N<<2],tsum[N<<2],lz[N<<2];
int ls(int o){return o<<1;}
int rs(int o){return o<<1|1;}
void f(int s,int e,int o,int x){
tmin[o]+=x*(e-s+1);
tsum[o]+=x*(e-s+1);
lz[o]+=x;
}
void push_up(int o){
tmin[o]=min(tmin[ls(o)],tmin[rs(o)]);
tsum[o]=tsum[ls(o)]+tsum[rs(o)];
}
void build(int s=1,int e=n,int o=1){
if (s==e){
tmin[o]=a[s];
tsum[o]=a[s];
return;
}
int mid=(s+e)>>1;
build(s,mid,ls(o));
build(mid+1,e,rs(o));
push_up(o);
}
void push_down(int s,int e,int o){
if (!lz[o])return;
int mid=(s+e)>>1;
f(s,mid,ls(o),lz[o]);
f(mid+1,e,rs(o),lz[o]);
lz[o]=0;
}
void update(int l,int r,int x,int s=1,int e=n,int o=1){
if (l<=s&&e<=r){
f(s,e,o,x);
return;
}
push_down(s,e,o);
int mid=(s+e)>>1;
if (mid>=l)update(l,r,x,s,mid,ls(o));
if (mid+1<=r)update(l,r,x,mid+1,e,rs(o));
push_up(o);
}
int query_min(int l,int r,int s=1,int e=n,int o=1){
if (l<=s&&e<=r){
return tmin[o];
}
push_down(s,e,o);
int mid=(s+e)>>1,res=inf;
if (mid>=l)res=min(res,query_min(l,r,s,mid,ls(o)));
if (mid+1<=r)res=min(res,query_min(l,r,mid+1,e,rs(o)));
return res;
}
int query_sum(int l,int r,int s=1,int e=n,int o=1){
if (l<=s&&e<=r){
return tsum[o];
}
push_down(s,e,o);
int mid=(s+e)>>1,res=0;
if (mid>=l)res+=query_sum(l,r,s,mid,ls(o));
if (mid+1<=r)res+=query_sum(l,r,mid+1,e,rs(o));
return res;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>q;
for (int i=1;i<=n;i++)cin>>a[i];
build();
for (int i=1;i<=q;i++){
char op;
cin>>op;
if (op=='M'){
int l,r;
cin>>l>>r;
cout<<query_min(l,r)<<"\n";
}else if (op=='P'){
int l,r,x;
cin>>l>>r>>x;
update(l,r,x);
}else if (op=='S'){
int l,r;
cin>>l>>r;
cout<<query_sum(l,r)<<"\n";
}
}
}