#include <stdio.h>
int n, m;
int tree[400007];
void update(int nod, int a, int b, int pos, int val);
int get_max(int nod, int a, int b, int pa, int pb);
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
int val;
int i;
for (i = 1; i <= n; ++i) {
scanf("%d", &val);
update(1, 1, n, i, val);
}
while (m--) {
int cod, a, b;
scanf("%d%d%d", &cod, &a, &b);
if (cod == 0) {printf("%d\n", get_max(1, 1, n, a, b));}
if (cod == 1) {update(1, 1, n, a, b);}
}
return 0;
}
int get_max(int nod, int a, int b, int pa, int pb) {
if (pb < a || pa > b || b < a || pb < pa) return -1;
if (pa <= a && pb >= b) return tree[nod];
int mid = a + b; mid >>= 1;
int A = get_max(nod << 1, a, mid, pa, pb);
int B = get_max((nod << 1) + 1, mid + 1, b, pa, pb);
if (A > B) return A;
return B;
}
void update(int nod, int a, int b, int pos, int val) {
if (pos < a || pos > b || a > b) return;
if (a == pos && pos == b) {tree[nod] = val; return;}
tree[nod] = -1;
int mid = a + b; mid >>= 1;
update( nod<<1, a, mid, pos, val);
update( (nod<<1) + 1, mid + 1, b, pos, val);
tree[nod] = tree[nod << 1];
if (tree[(nod << 1)+1] > tree[nod]) tree[nod] = tree[(nod << 1) + 1];
}