#include <iostream>
#include <cstdio>
#define NMAX 100000
using namespace std;
int n, m;
int v[NMAX + 5], aint[4 * NMAX + 5];
void gen_aint(int poz, int st, int dr) {
if(st == dr)
aint[poz] = v[st];
else {
gen_aint(2 * poz, st, (st + dr) / 2);
gen_aint(2 * poz + 1, (st + dr) / 2 + 1, dr);
aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}
}
int get_max(int poz, int st, int dr, int a, int b) {
int mij = (st + dr) / 2;
if(dr < a || st > b)
return 0;
if(st >= a && dr <= b)
return aint[poz];
if(st >= a)
return max(aint[2 * poz], get_max(2 * poz + 1, mij + 1, dr, a, b));
if(dr <= b)
return max(aint[2 * poz + 1], get_max(2 * poz, st, mij, a, b));
return max(get_max(2 * poz, st, mij, a, b), get_max(2 * poz + 1, mij + 1, dr, a, b));
}
void update(int poz, int st, int dr, int a, int b) {
int mij = (st + dr) / 2;
if(st < dr) {
if(a > mij) {
update(2 * poz + 1, mij + 1, dr, a, b);
aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}
else {
update(2 * poz, st, mij, a, b);
aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}
}
else
aint[poz] = b;
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int op, a, b;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &v[i]);
gen_aint(1, 1, n);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &op, &a, &b);
if(op == 0)
printf("%d\n", get_max(1, 1, n, a, b));
else
update(1, 1, n, a, b);
}
return 0;
}