#include <bits/stdc++.h>
using namespace std;
#define M 10005
int add[M];
struct set_ren{
int l;
int r;
}p[M];
int minn[M],maxx[M];
void upget(int rt)
{
minn[rt]=min(minn[rt*2],minn[rt*2+1]);
maxx[rt]=max(maxx[rt*2],maxx[rt*2+1]);
}
void set_tu(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&minn[rt]);
maxx[rt]=minn[rt];
return;
}
p[rt].l=l;p[rt].r=r;
int mid=(l+r)/2;
set_tu(l,mid,rt*2);
set_tu(mid+1,r,rt*2+1);
upget(rt); //ok
}
void downget(int rt)
{
if(add[rt]==0) return;
add[rt*2]+=add[rt];
add[rt*2+1]+=add[rt];
maxx[rt*2]+=add[rt];
minn[rt*2]+=add[rt];
maxx[rt*2+1]+=add[rt];
minn[rt*2+1]+=add[rt];
}
void xiugai(int l,int r,int rt,int c)
{
if(l<=p[rt].l&&p[rt].r<=r)
{
add[rt]+=c;
maxx[rt]+=c;
minn[rt]+=c;
return ;
}
if(add[rt])
downget(rt); //shi na ge qu jian
int mid=(p[rt].l+p[rt].r)/2;
if(r<=mid) xiugai(l,r,rt*2,c);
else if(l>mid) xiugai(l,r,rt*2+1,c);
else xiugai(l,mid,rt*2,c),xiugai(mid+1,r,rt*2+1,c);
upget(rt);
}
int max_quary(int l,int r,int rt)
{
if(l<=p[rt].l&&p[rt].r<=r)
{
return maxx[rt];
}
int ret=-0x3f3f3f;
if(add[rt]) downget(rt);
int mid=(p[rt].l+p[rt].r)/2;
if(r<=mid) ret=max(ret,max_quary(l,r,rt*2));
else if(l>mid) ret=max(ret,max_quary(l,r,rt*2+1));
else return max(ret,max(max_quary(l,mid,rt*2),max_quary(mid+1,r,rt*2+1)));
}
int min_quary(int l,int r,int rt)
{
if(l<=p[rt].l&&p[rt].r<=r)
{
return minn[rt];
}
int ret=0x3f3f3f;
if(add[rt]) downget(rt);
int mid=(p[rt].l+p[rt].r)/2;
if(r<=mid) ret=min(ret,min_quary(l,r,rt*2));
else if(l>mid) ret=min(ret,min_quary(l,r,rt*2+1));
else return min(ret,min(min_quary(l,mid,rt*2),min_quary(mid+1,r,rt*2+1)));
}
int n,m,a,b,c;
int main(){
scanf("%d%d",&n,&m);
set_tu(1,n,1);
for(int i=1;i<=m;i++)
{ int z;
scanf("%d",&z);
if(z==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",max_quary(a,b,1)-min_quary(a,b,1));
}
else
{
scanf("%d%d%d",&a,&b,&c);
xiugai(a,b,1,c);
}
}
}