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