#include<fstream>
#define inf 1<<30
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,cer,a,b,q;
int tree[200005],lazy[200005],init[100005];
void update(int nod,int a,int b,int i,int j,int val)
{
if(lazy[nod]!=0)
{
tree[nod]+=lazy[nod];
if(a!=b)
{
lazy[nod*2]+=lazy[nod];
lazy[nod*2+1]+=lazy[nod];
}
lazy[nod]=0;
}
if(a>b||a>j||b<i)
return;
if(a>=i&&b<=j)
{
tree[nod]+=val;
if(a!=b)
{
lazy[nod*2]+=val;
lazy[nod*2+1]+=val;
}
return;
}
update(nod*2,a,(a+b)/2,i,j,val);
update(1+nod*2,1+(a+b)/2,b,i,j,val);
tree[nod]=max(tree[nod*2],tree[nod*2+1]);
}
int query(int nod,int a,int b,int i,int j)
{
if(a>b||a>j||b<i)
return -inf;
if(lazy[nod]!=0)
{
tree[nod]+=lazy[nod];
if(a!=b)
{
lazy[nod*2]+=lazy[nod];
lazy[nod*2+1]+=lazy[nod];
}
lazy[nod]=0;
}
if(a>=i&&b<=j)
return tree[nod];
int q1=query(nod*2,a,(a+b)/2,i,j);
int q2=query(1+nod*2,1+(a+b)/2,b,i,j);
int res=max(q1,q2);
return res;
}
int main()
{
f>>n>>q;
for(int i=1;i<=n;i++)
{
f>>a;
init[i]=a;
update(1,1,n,i,i,a);
}
while(q--)
{
f>>cer>>a>>b;
if(cer==1)
{
update(1,1,n,a,a,b-init[a]);
init[a]=b;
}
else
g<<query(1,1,n,a,b)<<"\n";
}
return 0;
}