#include<cstdio>
#include<algorithm>
using namespace std;
const int nMax = 100000 + 5;
int n, q, arb[4 * nMax];
void update (int pos, int val, int l, int r, int nod){
if (r == l){
arb[nod] = val;
return;
}
int m = (r + l) / 2;
if(pos <= m) update(pos, val, l, m, 2 * nod);
else update(pos, val, m + 1, r, 2 * nod + 1);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
int query (int a, int b, int l, int r, int nod){
if(a <= l && b >= r)
return arb[nod];
int m = (l + r) / 2;
int m1 = -1, m2 = -1;
if(a <= m) m1 = query(a, b, l, m, nod * 2);
if (b > m) m2 = query(a, b, m + 1, r, nod * 2 + 1);
return max(m1, m2);
}
int main (){
FILE *in = fopen("arbint.in","r");
FILE *out = fopen("arbint.out","w");
int x;
fscanf(in,"%d%d",&n,&q);
for (int i = 1 ; i <= n ; ++i){
fscanf(in,"%d",&x);
update(i, x, 1, n, 1);
}
int a, b, c;
while(q--){
fscanf(in,"%d%d%d",&a,&b,&c);
if(a == 0){
fprintf(out, "%d\n", query(b, c, 1, n, 1));
}else{
update(b, c, 1, n, 1);
}
}
return 0;
}