#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], v);
}
/*int query(int node, int left, int right, int st, int fn) {
if(left >= right) return a[node];
int mid = (left + right) / 2, sol = 0;
if(st <= mid) sol = max(sol, query(node * 2, left, mid, st, mid));
if(fn >= mid) sol = max(sol, query(node * 2 + 1, mid + 1, right, mid + 1, fn));
return sol;
}*/
inline int query(int node, int left, int right, int i, int j)
{
if(i<=left && right<=j) return a[node];
int middle=(left+right)/2, sol=0;
if(i<=middle) sol=max(sol,query(2*node, left, middle, i,j));
if(j>middle) sol=max(sol,query(2*node+1, middle+1,right, i, j));
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;
}