#include <stdio.h>
#define NMAX 100001
int v[NMAX];
int aint[4*NMAX];
void build(int nod, int st, int dr) {
int mijl, fiust, fiudr;
if (st == dr) {
aint[nod] = v[st];
return;
}
mijl = (st+dr)/2;
fiust = nod+1;
fiudr = nod + 2*(mijl-st+1);
build(fiust, st, mijl);
build(fiudr, mijl+1, dr);
if (aint[fiust]>aint[fiudr]) {
aint[nod] = aint[fiust];
} else {
aint[nod] = aint[fiudr];
}
}
int query(int nod, int st, int dr, int qst, int qdr) {
int mijl, fiust, fiudr, stmax, drmax;
if (qst<=st && qdr>=dr) {
return aint[nod];
}
mijl = (st+dr)/2;
fiust = nod+1;
fiudr = nod + 2*(mijl-st+1);
stmax = 0;
drmax = 0;
if (qst<=mijl) {
stmax = query(fiust, st, mijl, qst, qdr);
}
if (mijl<qdr) {
drmax = query(fiudr, mijl+1, dr, qst, qdr);
}
if (stmax>drmax) {
return stmax;
}
return drmax;
}
void update(int nod, int st, int dr, int poz, int val) {
int mijl, fiust, fiudr;
if (st == dr) {
aint[nod] = val;
return;
}
mijl = (st+dr)/2;
fiust = nod+1;
fiudr = nod + 2*(mijl-st+1);
if (poz <= mijl) {
update(fiust, st, mijl, poz, val);
} else {
update(fiudr, mijl+1, dr, poz, val);
}
if (aint[fiust] > aint[fiudr]) {
aint[nod] = aint[fiust];
} else {
aint[nod] = aint[fiudr];
}
}
int main() {
FILE *fin, *fout;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
int n, q, i, op, a, b, qq;
fscanf(fin, "%d%d", &n, &q);
for (i=0; i<n; i++) {
fscanf(fin, "%d", &v[i]);
}
build (0, 0, n-1);
for (qq=0; qq<q; qq++) {
fscanf(fin, "%d%d%d", &op, &a, &b);
a--;
if (op == 1) {
v[a] = b;
update(0, 0, n-1, a, b);
} else if (op == 0) {
b--;
fprintf(fout, "%d\n", query(0, 0, n-1, a, b));
}
}
fclose(fin);
fclose(fout);
return 0;
}