#include <cstdio>
using namespace std;
int arb[400004];
int max(int a, int b) {
return a >= b ? a:b;
}
void update(int node, int l, int r, int a, int pos) {
if (l >= r) {
arb[node] = a;
return;
}
int m = (l + r) / 2;
if (pos<=m)
update(2 * node, l, m, a, pos);
else
update(2 * node + 1, m + 1, r, a, pos);
arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}
int query(int node, int l, int r, int a, int b) {
if (a <=l && b >= r)
return arb[node];
int m = ( l + r) / 2;
int current = -1;
if (a<=m)
current = query(2 * node, l, m, a, b);
if (m<b)
current = max(current, query(2*node + 1, m + 1, r, a, b));
return current;
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, a, b, inst;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i) {
scanf("%d", &inst);
update(1, 1, n, inst, i);
}
for(int i=0; i<m; ++i) {
scanf("%d%d%d", &inst, &a, &b);
if(inst == 0)
printf("%d\n", query(1, 1, n, a, b));
else
update(1, 1, n, b, a);
}
return 0;
}