//Nu lua asta ca exemplu!
#include <fstream>
#define Nmax 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,N,tree[Nmax*4],lazy[Nmax*4],v[Nmax+1];
void UP(int nod, int st, int dr, int L, int R, int val)
{
if (lazy[nod]!=0)
{
tree[nod] += lazy[nod];
if (nod<N)
{
lazy[nod*2] += lazy[nod];
lazy[nod*2+1] += lazy[nod];
}
lazy[nod] = 0;
}
if (L<=st && dr<=R)
{
tree[nod] += val;
if (nod<N)
{
lazy[nod*2] += val;
lazy[nod*2+1] += val;
}
return;
}
else if (R<st || dr<L)
return;
int mid = (st+dr)/2;
int x,y;
UP(nod*2,st,mid,L,R,val);
UP(nod*2+1,mid+1,dr,L,R,val);
tree[nod] = max(tree[nod*2],tree[nod*2+1]);
}
int query(int nod, int st,int dr,int L, int R)
{
if (lazy[nod]!=0)
{
tree[nod] += lazy[nod];
if (nod<N)
{
lazy[nod*2] += lazy[nod];
lazy[nod*2+1] += lazy[nod];
}
lazy[nod] = 0;
}
if (L<=st && dr<=R)
return tree[nod];
int mid = (st+dr)/2;
int x = 0;
if (st<=R && mid>=L)
x = query(nod*2,st,mid,L,R);
if (L<=dr && R>mid)
x = max(x,query(nod*2+1,mid+1,dr,L,R));
return x;
}
int main()
{
int q;
f>>n>>q;
N = 1;
while (N<n)
N<<=1;
for (int i=1;i<=n;i++)
{
f>>v[i];
UP(1,1,N,i,i,v[i]);
}
for (int i=1;i<=q;i++)
{
int t,a,b;
f>>t>>a>>b;
if(t==1)
{
UP(1,1,N,a,a,b-tree[a+N-1]);
}
else
g<<query(1,1,N,a,b)<<'\n';
}
return 0;
}