#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
int dat,l,r,add,minn;
}e[200010<<2];
int a[200010];
void build(int l,int r,int p){
e[p].l=l,e[p].r=r;
if(l==r){
e[p].minn=e[p].dat=a[l];
return;
}
int mid=l+((r-l)>>1);
build(l,mid,p*2),build(mid+1,r,p*2+1);
e[p].dat=e[p*2].dat+e[p*2+1].dat;
e[p].minn=min(e[p*2].minn,e[p*2+1].minn);
}
int getsum(int l,int r,int p){
if(l<=e[p].l&&e[p].r<=r)
return e[p].dat;
int mid=e[p].l+((e[p].r-e[p].l)>>1),sum=0;
if(e[p].add){
e[p*2].add+=e[p].add,e[p*2+1].add+=e[p].add;
e[p*2].dat+=e[p].add*(e[p*2].r-e[p*2].l+1),e[p*2+1].dat+=e[p].add*(e[p*2+1].r-e[p*2+1].l+1);
e[p*2].minn+=e[p].add,e[p*2+1].minn+=e[p].add;
e[p].add=0;
}
if(l<=mid)
sum+=getsum(l,r,p*2);
if(r>mid)
sum+=getsum(l,r,p*2+1);
return sum;
}
void update(int l,int r,int c,int p){
if(l<=e[p].l&&e[p].r<=r){
e[p].add+=c,e[p].dat+=(e[p].r-e[p].l+1)*c,e[p].minn+=c;
return;
}
int mid=e[p].l+((e[p].r-e[p].l)>>1);
if(e[p].add){
e[p*2].add+=e[p].add,e[p*2+1].add+=e[p].add;
e[p*2].dat+=e[p].add*(e[p*2].r-e[p*2].l+1),e[p*2+1].dat+=e[p].dat*(e[p*2+1].r-e[p*2+1].l+1);
e[p*2].minn+=e[p].add,e[p*2 +1].minn+=e[p].add;
e[p].add=0;
}
if(l<=mid)
update(l,r,c,p*2);
if(r>mid)
update(l,r,c,p*2+1);
e[p].dat=e[p*2].dat+e[p*2+1].dat;
e[p].minn=min(e[p*2].minn,e[p*2+1].minn);
}
int querymin(int l,int r,int p){
if(l<=e[p].l&&e[p].r<=r)
return e[p].minn;
int mid=e[p].l+((e[p].r-e[p].l)>>1),ans=INT_MAX;
if(e[p].add){
e[p*2].add+=e[p].add,e[p*2+1].add+=e[p].add;
e[p*2].dat+=e[p].add*(e[p*2].r-e[p*2].l+1),e[p*2+1].dat+=e[p].add*(e[p*2+1].r-e[p*2+1].l+1);
e[p*2].minn+=e[p].add,e[p*2+1].minn+=e[p].add;
e[p].add=0;
}
if(l<=mid)
ans=min(ans,querymin(l,r,p*2));
if(r>mid)
ans=min(ans,querymin(l,r,p*2+1));
return ans;
}
signed main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
while(q--){
char op;
cin>>op;
if(op=='M'){
int a,b;
cin>>a>>b;
cout<<querymin(a,b,1)<<endl;
}
if(op=='P'){
int a,b,c;
cin>>a>>b>>c;
update(a,b,c,1);
}
if(op=='S'){
int a,b;
cin>>a>>b;
cout<<getsum(a,b,1)<<endl;
}
}
return 0;
}