#include <stdio.h>
#include <iostream>
using namespace std;
FILE *f,*g;
int n,op,x,poz,ma,s,d;
int arbore[400102];
void update(int nod, int st, int dr)
{
if(st==dr)
{
arbore[nod]=x;
return;
}
else
{
int mij=(st+dr)/2;
if(poz<=mij) update(2*nod,st,mij);
else update(2*nod+1,mij+1,dr);
}
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}
void detma(int nod, int st, int dr)
{
if(s<=st && dr<=d)///st si dr trebuie sa se afle in intervalul [s;d]
ma=max(ma,arbore[nod]);
else
{
int mij=(st+dr)/2;
if(s<=mij) detma(2*nod,st,mij);
if(mij<d)///daca mij ar fi egal cu dreapta atunci mij+1 ar iesi din interval
detma(2*nod+1,mij+1,dr);
}
}
int main()
{
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%d %d",&n,&op);
for(int i=1;i<=n;++i)
{
fscanf(f,"%d",&x);
poz=i;
update(1,1,n);
}
for(int i=1;i<=op;++i)
{
int p,a,b;
fscanf(f,"%d %d %d",&p,&a,&b);
if(p==1)
{
x=b;
poz=a;///pe pozitia lui a il punem pe b;
update(1,1,n);
}
else
{
s=a,d=b;
ma=-1;
detma(1,1,n);
fprintf(g,"%d\n",ma);
}
}
fclose(f);
fclose(g);
return 0;
}