#include<stdio.h>
int arb[280000],init[100002],n,x,y,m,tip,i;
void cstr(int st, int dr, int poz)
{
if(st==dr)
{
init[st]=poz;
return;
}
int mij=(st+dr)/2;
cstr(st,mij,2*poz);
cstr(mij+1,dr,2*poz+1);
}
int max(int a,int b)
{
if(a<b) return b;
else return a;
}
void update(int pozitie,int val)
{
int k=init[pozitie];
arb[k]=val;
for(k/=2;k>0;k/=2)
arb[k]=max(arb[2*k], arb[2*k+1]);
}
int caut(int st, int dr, int poz)
{
if(x<=st&&dr<=y)
return arb[poz];
if(st>y||dr<x)
return 0;
int mij=(st+dr)/2;
return max(caut(st,mij,2*poz), caut(mij+1,dr,2*poz+1));
}
int main()
{
freopen("ab.in","rt",stdin);
freopen("ab.out","wt",stdout);
scanf("%d",&n); //n=lung sirului;
scanf("%d",&m); //m=nr d operatii;
//citirea val sirului
for(i=1;i<=n;++i)
{
scanf("%d",x);
//facem update in poz i cu val x
update(i,x);
}
/*
citirea operatiilor
0-> adaug elem
1->returnarea maximului pe interval
*/
for(i=1;i<=m;++i)
{
scanf("%d%d%D",&tip,&x,&y);
if(tip==0) update(x,y);
else
printf("%d\n", caut(1,n,1));
}
return 0;
}