#include <cstdio>
#include <iostream>
using namespace std;
FILE *f,*g;
int arbore[200012];
int n,m,where,x,maa;
void ma(int a, int b, int st, int dr, int nod)
{
int mij;
if(a<=st && dr<=b)
{
maa=max(maa,arbore[nod]);
}
else//trebuie sa verific daca intervalul din fiul stang se gaseste in [a;b] sau cel din fiul drept
{
mij=(st+dr)/2;
if(a<=mij)//caut in fiul stang maximul
ma(a,b,st,mij,2*nod);
if(mij<b)//caut si in fiul drept maximul
ma(a,b,mij+1,dr,2*nod+1);
}
}
void det(int nod, int st, int dr)
{
int mij;
if(st==dr)
{
arbore[nod]=x;
return;
}
else
{
mij=(st+dr)/2;
if(where<=mij)
det(2*nod,st,mij);//fiul stang
else
det(2*nod+1,mij+1,dr);//fiul drept
}
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);//elementul maxim dintre prima jmatate si a 2 a, dintre fiul stang si cel drept
}
int main()
{
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%d %d",&n,&m);
for(int i=1;i<=n;++i)
{
fscanf(f,"%d",&x);
where=i;//ma ajuta sa vad daca x face parte din fiul stang sau fiul drept
det(1,1,n);
}
//for(int i=1;i<=10;++i)
// fprintf(g,"%d ",arbore[i]);
int type,a,b;
for(int i=1;i<=m;++i)
{
fscanf(f,"%d %d %d",&type,&a,&b);
if(type)
{
where=a;
x=b;
det(1,1,n);
}
else
{
maa=0;
ma(a,b,1,n,1);
fprintf(g,"%d\n",maa);
}
}
fclose(f);
fclose(g);
return 0;
}