#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2000005;
int a[N],lazy[N<<2],t[N<<2],tim[N<<2];
void pushup(int k){
t[k]=t[k<<1]+t[k<<1|1];
tim[k]=min(tim[k<<1],tim[k<<1|1]);
}
void build(int k,int l,int r){
if(l==r){
t[k]=tim[k]=a[l];
return ;
}
int mid=l+(r-l)/2;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void val(int k,int l,int r,int v){
lazy[k]+=v;
t[k]+=v*(r-l+1);
tim[k]+=v*(r-l+1);
}
void pushdown(int k,int l,int r){
int mid=l+(r-l)/2;
val(k<<1,l,mid,lazy[k]);
val(k<<1|1,mid+1,r,lazy[k]);
lazy[k]=0;
}
void updata(int L,int R,int v,int l,int r,int k){
if(L<=l&&r<=R){
t[k]+=v*(r-l+1);
tim[k]+=v*(r-l+1);
lazy[k]+=v;
return ;
}
int mid=l+(r-l)/2;
pushdown(k,l,r);
if(L<=mid){
updata(L,R,v,l,mid,k<<1);
}
if(R>mid){
updata(L,R,v,mid+1,r,k<<1|1);
}
pushup(k);
}
int query(int L,int R,int l,int r,int k){
if(L<=l&&r<=R){
return t[k];
}
pushdown(k,l,r);
int mid=l+(r-l)/2;
int sum=0;
if(L<=mid){
sum+=query(L,R,l,mid,k<<1);
}
if(R>mid){
sum+=query(L,R,mid+1,r,k<<1|1);
}
return sum;
}
int query1(int L,int R,int l,int r,int k){
if(L<=l&&r<=R){
return tim[k];
}
pushdown(k,l,r);
int mid=l+(r-l)/2;
int minn=1e9;
if(L<=mid){
minn=min(minn,query1(L,R,l,mid,k<<1));
}
if(R>mid){
minn=min(minn,query1(L,R,mid+1,r,k<<1|1));
}
return minn;
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
char op;
cin>>op;
if(op=='M'){
int x,y;
cin>>x>>y;
cout<<query1(x,y,1,n,1)<<endl;
}
else if(op=='S'){
int x,y;
cin>>x>>y;
cout<<query(x,y,1,n,1)<<endl;
}
else{
int x,y,k;
cin>>x>>y>>k;
updata(x,y,k,1,n,1);
}
}
return 0;
}