#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n, m, valMax, pos, arb[300001], left, right, val, poz;
void Update(int nod, int st, int dr){
if (st == dr) {
arb[nod] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m) Update(2*nod, st, m);
else Update(2*nod + 1, m + 1, dr);
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}
void Query(int nod, int st, int dr){
if (left <= st && dr <= right){
if (valMax < arb[nod]) valMax = arb[nod];
return;
}
int m = (st + dr) / 2;
if (left <= m) Query(nod * 2, st, m);
if (m < right) Query(nod * 2 + 1, m + 1, dr);
}
int main(){
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
int i, tip, a, b;
for (i = 1; i <= n; i++) {
scanf("%d", &a);
poz = i, val = a;
Update(1, 1, n);
}
for (i = 0; i < m; i++){
scanf("%d %d %d", &tip, &a, &b);
if (tip == 1){
poz = a, val = b;
Update(1, 1, n);
}
else {
valMax = -1;
left = a, right = b;
Query(1, 1, n);
printf ("%d\n", valMax);
}
}
}