#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q;
struct node{
ll l,r;
ll minx,sum;
ll lazy;
}tr[1000100];
ll l,r,d;
ll a[300100];
char opt;
void pushup(ll x){
tr[x].minx=min(tr[x<<1].minx,tr[x<<1|1].minx);
tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum;
}
void pushdown(ll x){
ll mid=tr[x].l+tr[x].r>>1;
if (tr[x].lazy!=0){
tr[x<<1].lazy+=tr[x].lazy;
tr[x<<1|1].lazy+=tr[x].lazy;
tr[x<<1].minx+=tr[x].lazy;
tr[x<<1|1].minx+=tr[x].lazy;
tr[x<<1].sum+=(tr[x].lazy*(mid-tr[x].l+1));
tr[x<<1|1].sum+=(tr[x].lazy*(tr[x].r-mid));
tr[x].lazy=0;
}
}
void build(ll x,ll l,ll r){
tr[x].l=l;
tr[x].r=r;
if (l==r){
tr[x].minx=a[l];
tr[x].sum=a[l];
return;
}
ll mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void change(ll x,ll l,ll r,ll d){
if (l<=tr[x].l && tr[x].r<=r){
tr[x].minx+=d;
tr[x].sum+=(d*tr[x].r-tr[x].l+1);
tr[x].lazy+=d;
return;
}
ll mid=tr[x].l+tr[x].r>>1;
if (l<=mid)
change(x<<1,l,r,d);
if (mid+1<=r)
change(x<<1|1,l,r,d);
pushup(x);
}
ll ask1(ll x,ll l,ll r){
if (l<=tr[x].l && tr[x].r<=r){
return tr[x].minx;
}
pushdown(x);
ll res=9e18;
ll mid=tr[x].l+tr[x].r>>1;
if (l<=mid)
res=min(res,ask1(x<<1,l,r));
if (mid+1<=r)
res=min(res,ask1(x<<1|1,l,r));
return res;
}
ll ask2(ll x,ll l,ll r){
if (l<=tr[x].l && tr[x].r<=r){
return tr[x].sum;
}
pushdown(x);
ll res=0;
ll mid=tr[x].l+tr[x].r>>1;
if (l<=mid)
res+=ask2(x<<1,l,r);
if (mid+1<=r)
res+=ask2(x<<1|1,l,r);
return res;
}
int main(){
cin>>n>>q;
for (int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--){
cin>>opt;
if (opt=='P'){
cin>>l>>r>>d;
change(1,l,r,d);
}else if (opt=='M'){
cin>>l>>r;
cout<<ask1(1,l,r)<<endl;
}else if (opt=='S'){
cin>>l>>r;
cout<<ask2(1,l,r)<<endl;
}
}
}