#include<cstdio>
#include<algorithm>
#include<cstring>
using
namespace
std;
int
n,m;
long
long
a[500005];
const
long
long
INF=1000000000000000ll;
template
<
typename
T>
void
Read(T &x){
char
ch;
while
((ch=
getchar
())<
'0'
|| ch>
'9'
);
x=ch-
'0'
;
while
((ch=
getchar
())>=
'0'
&& ch<=
'9'
)x=x*10+ch-
'0'
;
}
struct
SegTree{
int
l,r;
long
long
v,mx,add,addmx;
SegTree(){}
SegTree(
long
long
V,
long
long
MX,
long
long
ADD,
long
long
ADDMX){v=V;mx=MX;add=ADD;addmx=ADDMX;}
SegTree(
int
L,
int
R,
long
long
V,
long
long
MX,
long
long
ADD,
long
long
ADDMX){l=L;r=R;v=V;mx=MX;add=ADD;addmx=ADDMX;}
}tree[2000005],tmp;
SegTree Update(SegTree A,SegTree B){
return
SegTree(A.l,A.r,max(A.v+B.add,B.v),max(max(A.mx,B.mx),A.v+B.addmx),max(A.add+B.add,-INF),max(A.addmx,A.add+B.addmx));
}
void
Pushdown(
int
rt){
tree[rt*2]=Update(tree[rt*2],tree[rt]);
tree[rt*2+1]=Update(tree[rt*2+1],tree[rt]);
tree[rt]=SegTree(tree[rt].l,tree[rt].r,0,0,0,0);
}
void
Build(
int
rt,
int
l,
int
r){
tree[rt].l=l;tree[rt].r=r;
if
(l==r){
tree[rt].addmx=tree[rt].add=tree[rt].v=tree[rt].mx=a[l];
return
;
}
int
mid=l+r>>1;
Build(rt*2,l,mid);
Build(rt*2+1,mid+1,r);
}
void
Change(
int
rt,
int
l,
int
r){
if
(l<=tree[rt].l && tree[rt].r<=r){tree[rt]=Update(tree[rt],tmp);
return
;}
Pushdown(rt);
int
mid=tree[rt].l+tree[rt].r>>1;
if
(l<=mid)Change(rt*2,l,r);
if
(r>mid)Change(rt*2+1,l,r);
}
long
long
Query(
int
rt,
int
pos,
int
id){
if
(tree[rt].l==tree[rt].r){
return
id?tree[rt].mx:tree[rt].v;}
Pushdown(rt);
int
mid=tree[rt].l+tree[rt].r>>1;
if
(pos<=mid)
return
Query(rt*2,pos,id);
if
(pos>mid)
return
Query(rt*2+1,pos,id);
}
int
main(){
freopen
(
"164.in"
,
"r"
,stdin);
freopen
(
"164.out"
,
"w"
,stdout);
Read(n);Read(m);
for
(
int
i=1;i<=n;i++)Read(a[i]);
Build(1,1,n);
for
(
int
i=1;i<=m;i++){
int
opt,l,r,v;
Read(opt);
if
(opt==1){Read(l);Read(r);Read(v);tmp=SegTree(0,0,v,v);Change(1,l,r);}
if
(opt==2){Read(l);Read(r);Read(v);tmp=SegTree(0,0,-v,-v);Change(1,l,r);}
if
(opt==3){Read(l);Read(r);Read(v);tmp=SegTree(v,v,-INF,-INF);Change(1,l,r);}
if
(opt==4){Read(v);
printf
(
"%lld\n"
,Query(1,v,0));}
if
(opt==5){Read(v);
printf
(
"%lld\n"
,Query(1,v,1));}
}
return
0;
}