#include<stdio.h>
int arb[280000],init[100005];
int n,x,y,tip,i,m;
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
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);
}
void uptade(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("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d",&n); //n->lungimea sirului
scanf("%d", &m); //m-> numarul de operatii
cstr(1,n,1);
//citire
for(i=1;i<=n;i++)
{
scanf("%d",&x);
uptade(i,x);
}
// citim operatiile
// 0->adaugam element
// 1-> returnarea maximului pe interval
for(i=1;i<=m;i++)
{
scanf("%d%d%d", &tip,&x,&y);
if(tip==0)
printf("%d\n",caut(1,n,1));
else
uptade(x,y);
}
return 0;
}