#include <bits/stdc++.h>
int aint[400001];
int mx(int a,int b)
{
if(a>b)
return a;
return b;
}
void insrt(int val,int nod,int st,int dr,int poz)
{
if(st==dr)
{
aint[poz]=val;
}
else
{
int med=(st+dr)/2;
if(nod<=med)
{
insrt(val,nod,st,med,poz*2);
}
else
{
insrt(val,nod,med+1,dr,poz*2+1);
}
aint[poz]=mx(aint[poz*2],aint[poz*2+1]);
}
}
int best;
void get(int a,int b,int st,int dr,int poz)
{
if(st>=a && dr<=b)
{
best=mx(best,aint[poz]);
}
else
{
int med=(st+dr)/2;
if(!(b<st || a>med))
{
get(a,b,st,med,poz*2);
}
if(!(b<med+1 || a>dr))
{
get(a,b,med+1,dr,poz*2+1);
}
}
}
int main()
{
int n,q,i,k,r,a,b;
FILE*fi,*fo;
fi=fopen("arbint.in","r");
fo=fopen("arbint.out","w");
fscanf(fi,"%d%d",&n,&q);
for(i=0; i<n; i++)
{
fscanf(fi,"%d",&k);
insrt(k,i,0,n-1,1);
}
for(i=0; i<q; i++)
{
fscanf(fi,"%d%d%d",&r,&a,&b);
a--;
if(r==1)
{
insrt(b,a,0,n-1,1);
}
if(r==0)
{
b--;
best=0;
get(a,b,0,n-1,1);
fprintf(fo,"%d\n",best);
}
}
fclose(fi);
fclose(fo);
return 0;
}