#include <stdio.h>
FILE *fin, *fout;
#define MAX 1 << 17
int M, N;
int v[MAX], arb[MAX * 2 + 2];
inline int maxi(int a, int b) {
if(a > b)
return a;
return b;
}
int update(int rad, int poz, int val, int st, int dr) {
if(st > dr)
return 0;
if(st == dr) {
arb[rad] = val;
return val;
}
if(st <= poz && (st + dr) / 2 >= poz)
update(rad * 2, poz, val, st, (st + dr) / 2);
else
update(rad * 2 + 1, poz, val, (st + dr) / 2 + 1, dr);
arb[rad] = maxi(arb[rad * 2], arb[rad * 2 + 1]);
return arb[rad];
}
int ans1;
int query(int rad, int a, int b, int st, int dr) {
if(st > dr)
return 0;
if(a <= st && b >= dr)
ans1 = maxi(arb[rad], ans1);
if(st == dr) {
return arb[rad];
}
else {
query(rad * 2, a, b, st, (st + dr) / 2);
query(rad * 2 + 1, a, b, (st + dr) / 2 + 1, dr);
}
return arb[rad];
}
int main() {
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d%d", &N, &M);
for(int i = 1;i <= N;i++) {
fscanf(fin, "%d", &v[i]);
update(1, i, v[i], 1, N);
}
for(int i = 1;i <= N;i++) {
int op, a, b;
ans1 = 0;
fscanf(fin, "%d%d%d", &op, &a, &b);
if(op == 0)
query(1, a, b, 1, N), fprintf(fout, "%d\n", ans1);
else
update(1, a, b, 1, N);
}
fclose(fin);
fclose(fout);
return 0;
}