#include <stdio.h>
#define FI fopen("arbint.in","r")
#define FO fopen("arbint.out","w")
long max(long a,long b) {if(a>b) return a; return b;}
struct Nod {
long val;
struct Interval {
long st,dr;
long mij() {
return (st+dr)/2;
};
} interval;
} nod[262146];
long n,m;
FILE *fi,*fo;
void create(long sir[],long lim) {
long i,j,mij;
j=1;
i=1;
nod[1].interval.st=1;
nod[1].interval.dr=n;
while(i) {
if(j<=nod[i].interval.dr) {
mij=nod[i].interval.mij();
if(j<=mij) {
i*=2;
nod[i].interval.st=nod[i/2].interval.st;
nod[i].interval.dr=mij;
}
else {
i=i*2+1;
nod[i].interval.st=mij+1;
nod[i].interval.dr=nod[i/2].interval.dr;
}
if(j==nod[i].interval.st && j==nod[i].interval.dr) {
nod[i].val=sir[j-1];
++j;
i/=2;
}
}
else {
nod[i].val=max(nod[i*2].val,nod[i*2+1].val);
i/=2;
}
}
}
void cit(FILE *f) {
long i,vec[100000];
fscanf(f,"%li%li",&n,&m);
for(i=0;i<n;i++)
fscanf(f,"%li",&vec[i]);
create(vec,n);
}
void update(long nd,long a,long b) {
long mij;
mij=nod[nd].interval.mij();
if(nod[nd].interval.st==a && nod[nd].interval.dr==a) {
nod[nd].val=b;
return;
}
if(a<=mij)
update(nd*2,a,b);
else
update(nd*2+1,a,b);
nod[nd].val=max(nod[nd*2].val,nod[nd*2+1].val);
}
void update(long a,long b) {update(1,a,b);}
long query(long nd,long a,long b) {
long mij=nod[nd].interval.mij(),ret=-1;
if(a<=nod[nd].interval.st && nod[nd].interval.dr<=b)
return nod[nd].val;
if(a<=mij)
ret=max(ret,query(nd*2,a,b));
if(b>mij)
ret=max(ret,query(nd*2+1,a,b));
return ret;
}
long query(long a,long b) {return query(1,a,b);}
int main() {
long i,a,b,st;
fi=FI;
fo=FO;
cit(fi);
for(i=0;i<m;i++) {
fscanf(fi,"%li%li%li",&st,&a,&b);
if(st)
update(a,b);
else {
fprintf(fo,"%li\n",query(a,b));
}
}
return 0;
}