#include <cstdio>
#include <iostream>
using namespace std;
int a[250001];
int sol;
FILE *fin=fopen ("arbint.in","r");
FILE *fout=fopen ("arbint.out","w");
void build (int nod,int st,int dr){
int mid;
if (st==dr)
fscanf (fin,"%d",&a[nod]);
else {
mid=(st+dr)/2;
build (2*nod,st,mid);
build (2*nod+1,mid+1,dr);
a[nod]=max(a[2*nod],a[2*nod+1]);
}
}
void update (int nod,int st,int dr,int x,int y){
int mid;
if (st==dr)
a[nod]=y;
else {
mid=(st+dr)/2;
if (x<=mid)
update (2*nod,st,mid,x,y);
else update (2*nod+1,mid+1,dr,x,y);
a[nod]=max(a[2*nod],a[2*nod+1]);
}
}
void query (int nod,int st,int dr,int x,int y){
int mid;
if (st>=x && y>=dr)
sol=max(sol,a[nod]);
else {
mid=(st+dr)/2;
if (x<=mid)
query (2*nod,st,mid,x,y);
if (mid+1<=y)
query (2*nod+1,mid+1,dr,x,y);
}
}
int main()
{
int n,m,i,cer,b,c;
fscanf (fin,"%d%d",&n,&m);
build (1,1,n);
for (i=1;i<=m;i++){
fscanf (fin,"%d%d%d",&cer,&b,&c);
if (cer==1)
update (1,1,n,b,c);
else {
sol=0;
query (1,1,n,b,c);
fprintf (fout,"%d\n",sol);
}
}
return 0;
}