#include<cstdio>
#include<algorithm>
using namespace std;
int a[500000], n, m;
void update(int node, int left, int right, int i, int v) {
if(left >= right) { a[node] = v; return; }
int mid = (left + right) / 2;
if(i <= mid) update(node * 2, left, mid, i, v);
else update(node * 2 + 1, mid + 1, right, i, v);
a[node] = max(a[node * 2], a[2 * node + 1]);
}
int query(int node, int left, int right, int st, int fn) {
if(st <= left && right <= fn) return a[node];
int mid = (left + right) / 2, sol = 0;
if(st <= mid) sol = max(sol, query(node * 2, left, mid, st, fn));
if(fn > mid) sol = max(sol, query(node * 2 + 1, mid + 1, right, st, fn));
return sol;
}
int main() {
int i, st, fn, t;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= n; ++i) {
scanf("%d", &t);
update(1, 1, n, i, t);
}
while(m--) {
scanf("%d%d%d", &t, &st, &fn);
if(t == 0)
printf("%d\n", query(1, 1, n, st, fn));
else update(1, 1, n, st, fn);
}
return 0;
}