#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f
int n, m;
const int maxn = 5e5 + 5;
int a[maxn];
struct node{
int sum;
int maxx;
int maxl;
int maxr;
};
node val[maxn << 2];
node nul;
void merge(node &res, const node &l, const node &r){
res.sum = l.sum + r.sum;
res.maxx = max (max (l.maxx,r.maxx), l.maxr+r.maxl);
res.maxl = max (l.maxl, l.sum + r.maxl);
res.maxr = max (r.maxr, r.sum + l.maxr);
}
void pushup(int rt){
merge(val[rt], val[rt<<1],val[rt<<1|1]);
}
void modify (node &res, int x){
res.maxx = x;
res.maxl = x;
res.maxr = x;
res.sum = x;
}
void build (int rt, int l, int r){
if (l == r){
modify(val[rt],a[l]);
return ;
}
int mid = (l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt, int l, int r, int pos, int k){
if (l==pos && r==pos){
modify(val[rt], k);
return ;
}
int mid = (l + r)>>1;
if (pos<=mid){
update(rt<<1,l,mid,pos,k);
}else{
update(rt<<1|1,mid+1,r,pos,k);
}
pushup(rt);
}
node query(int rt, int l, int r, int ql, int qr){
if (qr < l || ql > r){
return nul;
}
if(ql <= l && r <= qr){
return val[rt];
}
int mid = (l+r)>>1;
node res = nul;
node tmp = nul;
merge(res,tmp,query(rt<<1,l,mid,ql,qr));
tmp = res;
merge(res,tmp,query(rt<<1|1,mid+1,r,ql,qr));
return res;
}
int main () {
nul.sum = -inf;
nul.maxx = -inf;
nul.maxr = -inf;
nul.maxl = -inf;
cin >> n >> m;
for (int i = 1;i <= n; i++){
cin >> a[i];
}
build (1,1,n);
while (m--){
int op, x, y;
cin >> op >> x >> y;
if (op == 1){
if (x > y) swap(x, y);
node ans = query(1,1,n,x,y);
cout << ans.maxx <<'\n';
}else{
update(1,1,n,x,y);
}
}
return 0;
}