有WA有TLE。
#include<bits/stdc++.h>
#define LL long long
#define int LL
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dow(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
LL read()
{
LL x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void write(LL x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
#define pl p<<1
#define pr p<<1|1
const int N=2e5+1,INF=LONG_LONG_MAX;
int v[N],n,m;
struct T{int l,r,lazy,Min,v;} a[N<<2];
void pushup(int p)
{
if(a[p].l==a[p].r) return;
a[p].Min=min(a[pr].Min,a[pl].Min),
a[p].v=a[pl].v+a[pr].v;
}
void down(int p)
{
if(!a[p].lazy) return;
if(a[p].l==a[p].r){a[p].Min+=a[p].lazy,a[p].v+=a[p].lazy,a[p].lazy=0;return;}
a[pl].lazy+=a[p].lazy,
a[pr].lazy+=a[p].lazy,
a[pl].Min+=a[pl].lazy,
a[pr].Min+=a[pr].lazy,
a[pl].v+=a[pl].lazy*(a[pl].r-a[pl].l+1),
a[pr].v+=a[pr].lazy*(a[pr].r-a[pr].l+1),
a[p].lazy=0;
}
void Build(int l,int r,int p)
{
a[p]={l,r,0};
if(l==r) {a[p].Min=a[p].v=v[l];return;}
int mid=l+r>>1;
Build(l,mid,pl);
Build(mid+1,r,pr);
pushup(p);
}
void update(int l,int r,int v,int p)
{
if(l<=a[p].l&&a[p].r<=r) {a[p].lazy+=v;}
down(p);
if(a[p].l==a[p].r) return;
if(a[pr].l<=r) update(l,r,v,pr);
if(a[pl].r>=l) update(l,r,v,pl);
pushup(p);
}
int query_Min(int l,int r,int p)
{
pushup(p);
int ans=INF;
if(a[p].lazy) down(p);
if(l<=a[p].l&&a[p].r<=r) {return a[p].Min;}
if(a[p].l==a[p].r) return a[p].Min;
if(a[pr].l<=r) ans=query_Min(l,r,pr);
if(a[pl].r>=l) ans=min(ans,query_Min(l,r,pl));
return ans;
}
int query_v(int l,int r,int p)
{
pushup(p);
if(a[p].lazy) down(p);
if(l<=a[p].l&&a[p].r<=r) {return a[p].v;}
int ans=0;
if(a[p].l==a[p].r) return a[p].v;
if(a[pr].l<=r) ans+=query_v(l,r,pr);
if(a[pl].r>=l) ans+=query_v(l,r,pl);
return ans;
}
signed main()
//int main()
{
n=read(),m=read();
rep(i,1,n) v[i]=read();
Build(1,n,1);
char rt;
int aa,b,c;
while(m--)
{
cin>>rt;aa=read(),b=read();
if(rt=='M') write(query_Min(aa,b,1)),puts("");
if(rt=='P') c=read(),update(aa,b,c,1);
if(rt=='S') write(query_v(aa,b,1)),puts("");
}
//for(int i=1;i<=7;i++) cout<<i<<" "<<a[i].l<<" "<<a[i].r<<" "<<a[i].Min<<" "<<a[i].v<<" "<<a[i].lazy<<endl;
return 0;
}