#include<stdio.h>
int arb[100010*4];
int max;
void set(int node, int left, int right, int pos, int val)
{
if(left == right) {
arb[node] = val;
return;
}
int mid = (left + right)/2;
if(pos <= mid) set(node * 2, left, mid, pos, val);
else set(node * 2 + 1, mid + 1, right, pos, val);
arb[node] = arb[node * 2] > arb[node * 2 + 1] ? arb[node * 2] : arb[node * 2 + 1];
}
void ret(int node, int left, int right, int a, int b)
{
if(a <= left && right <= b) {
if(max < arb[node]) max = arb[node];
return;
}
int mid = (left + right) / 2;
if(a <= mid) ret(node * 2, left, mid, a, b);
if(mid < b) ret(node * 2 + 1, mid + 1, right, a, b);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0 ; i < n ; ++i) {
int val;
scanf("%d", &val);
set(1, 1, n, i + 1, val);
}
for(int i = 0; i < m ; ++i) {
int type, a, b;
scanf("%d%d%d", &type, &a, &b);
if(type == 1) {
set(1, 1, n, a, b);
} else {
max = -1;
ret(1, 1, n, a, b);
printf("%d\n", max);
}
}
return 0;
}