#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
int l,r;
ll sum,lazy,Min;
}t[800005];
int n,q,a[800005],l,r,x;
char opt;
inline int read(){
int x=0;bool f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=0;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return f?x:-x;
}
void pushdown(int p){
if(!t[p].lazy)
return ;
t[p<<1].lazy+=t[p].lazy;
t[p<<1|1].lazy+=t[p].lazy;
t[p<<1].Min+=t[p].lazy;
t[p<<1|1].Min+=t[p].lazy;
t[p<<1].sum+=(t[p<<1].r-t[p<<1].l+1)*t[p].lazy;
t[p<<1|1].sum+=(t[p<<1|1].r-t[p<<1|1].l+1)*t[p].lazy;
t[p].lazy=0;
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=a[l],t[p].Min=a[l];
return ;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
t[p].Min=min(t[p<<1].Min,t[p<<1|1].Min);
}
ll gsum(int p,int l,int r){
if(t[p].l>=l&&t[p].r<=r)
return t[p].sum;
pushdown(p);
int mid=t[p].l+t[p].r>>1;
ll res=0;
if(l<=mid)
res+=gsum(p<<1,l,r);
if(r>mid)
res+=gsum(p<<1|1,l,r);
return res;
}
ll gmin(int p,int l,int r){
if(t[p].l>=l&&t[p].r<=r)
return t[p].Min;
pushdown(p);
int mid=t[p].l+t[p].r>>1;
ll res=0x7f7f7f7f;
if(l<=mid)
res=gmin(p<<1,l,r);
if(r>mid)
res=min(res,gmin(p<<1|1,l,r));
return res;
}
void Add(int p,int l,int r,int x){
if(t[p].l>=l&&t[p].r<=r){
t[p].lazy+=x,t[p].Min+=x,t[p].sum+=(t[p].r-t[p].l+1)*x;
return ;
}
pushdown(p);
int mid=t[p].l+t[p].r>>1;
if(l<=mid)
Add(p<<1,l,r,x);
if(r>mid)
Add(p<<1|1,l,r,x);
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
t[p].Min=min(t[p<<1].Min,t[p<<1|1].Min);
}
int main(){
n=read(),q=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
while(q--){
cin>>opt;
l=read(),r=read();
if(opt=='M')
printf("%lld\n",gmin(1,l,r));
if(opt=='S')
printf("%lld\n",gsum(1,l,r));
if(opt=='P'){
x=read();
Add(1,l,r,x);
}
}
return 0;
}