#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m;
int arb[400100];
void go();
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
go();
return 0;
}
void update(int i, int j, int p, int nod, int v) {
if(i==j && j==p) {
arb[nod]=v;
return;
}
int mij=(i+j)/2;
if(p<=mij) {
update(i,mij,p,nod*2,v);
} else {
update(mij+1,j,p,nod*2+1, v);
}
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int query(int i, int j, int x, int y, int nod) {
if(x<=i && j<=y)
return arb[nod];
int mij=(i+j)/2;
int r=-1;
if(x<=mij)
r=max( r, query(i,mij,x,y,nod*2) );
if(mij<y)
r=max( r, query(mij+1, j, x,y, nod*2+1) );
return r;
}
void go() {
int i;
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++) {
int tmp;
scanf("%d", &tmp);
update(1,n,i,1,tmp);
}
for(i=1; i<=m; i++) {
int a,b,c;
scanf("%d%d%d", &c,&a,&b);
if(c) {
//update, a devine b
update(1,n,a,1,b);
} else { //query, maximul din [a,b]
int aux=query(1,n,a,b,1);
printf("%d\n", aux);
}
}
}