#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
int aint[4 * NMAX];
void update(int nod, int val, int poz, int st, int dr) {
if(st > dr) {
return ;
}
if(st == dr) {
aint[nod] = val;
return ;
}
int mij = (st + dr) / 2;
if(mij >= poz) {
update(2 * nod, val, poz, st, mij);
}
else {
update(2 * nod + 1, val, poz, mij + 1, dr);
}
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int query(int nod, int a, int b, int st, int dr) {
if(dr < a) {
return 0;
}
if(st > b) {
return 0;
}
if(st == dr) {
return aint[nod];
}
int sol = 0;
int mij = (st + dr) / 2;
if(st <= b) {
sol = max(sol, query(2 * nod, a, b, st, mij));
}
if(dr >= a) {
sol = max(sol, query(2 * nod + 1, a, b, mij + 1, dr));
}
return sol;
}
int main() {
int n, m;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
update(1, x, i, 1, n);
}
for(int nrq = 0; nrq < m; ++nrq) {
int op, a, b;
scanf("%d%d%d", &op, &a, &b);
if(op == 1) {
update(1, b, a, 1, n);
}
else {
printf("%d\n", query(1, a, b, 1, n));
}
}
return 0;
}