#include <stdio.h>
#define TREE_MAXN 400004
#define MAXN 100001
int n, m, v[MAXN], t[TREE_MAXN];
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
void build(int nod, int st, int dr) {
if(st == dr) {
t[nod] = v[st];
return;
}
int mij = st + (dr - st) / 2, left_child = nod << 1,
right_child = (nod << 1) + 1;
build(left_child, st, mij);
build(right_child, mij + 1, dr);
t[nod] = max(t[left_child], t[right_child]);
}
int query(int nod, int t_st, int t_dr, int st, int dr) {
if(st > dr)
return 0;
if(st == t_st && dr == t_dr)
return t[nod];
int mij = t_st + (t_dr - t_st) / 2;
return max(query(nod << 1, t_st, mij, st, min(dr, mij)),
query((nod << 1) + 1, mij + 1, t_dr, max(st, mij + 1), dr));
}
void update(int nod, int st, int dr, int pos, int val) {
if(st == dr) {
t[nod] = val;
return;
}
int mij = st + (dr - st) / 2;
if(pos <= mij) {
update(nod << 1, st, mij, pos, val);
} else {
update((nod << 1) + 1, mij + 1, dr, pos, val);
}
t[nod] = max(t[nod << 1], t[(nod << 1) + 1]);
}
int main() {
FILE *in = fopen("arbint.in", "r"), *out;
fscanf(in, "%d %d\n", &n, &m);
for(int i = 1; i <= n; ++i) {
fscanf(in, "%d ", v + i);
}
build(1, 1, n);
out = fopen("arbint.out", "w");
while(m--) {
int a, b, c;
fscanf(in, "%d %d %d\n", &a, &b, &c);
if(a == 0) {
fprintf(out, "%d\n", query(1, 1, n, b, c));
} else {
update(1, 1, n, b, c);
}
}
fclose(in);
fclose(out);
}