#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MX = 4*1e5+1;
int n, m, A[MX], st[MX];
void build(int node, int b, int e) {
if (b == e) {
st[node] = A[b];
return;
}
build(2*node, b, (b+e)/2);
build(2*node+1, (b+e)/2+1, e);
st[node] = max(st[2*node], st[2*node+1]);
}
void update(int node, int b, int e, int i, int j, int val) {
if (i > e || j < b) return;
if (b == e) {
st[node] = val;
return;
}
update(2*node, b, (b+e)/2, i, j, val);
update(2*node+1, (b+e)/2+1, e, i, j, val);
st[node] = max(st[2*node], st[2*node+1]);
}
int query(int node, int b, int e, int i, int j) {
if (i > e || j < b) return -1;
if (i <= b && e <= j) return st[node];
int x, y;
x = query(2*node, b, (b+e)/2, i, j);
y = query(2*node+1, (b+e)/2+1, e, i, j);
return max(x, y);
}
int main() {
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
scanf ("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
scanf ("%d", &A[i]);
}
build(1, 0, n-1);
int x, y, z;
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &x, &y, &z);
if (x == 0) {
printf("%d\n", query(1, 0, n-1, y-1, z-1));
}
else {
update(1, 0, n-1, y-1, y-1, z);
}
}
return 0;
}