#include <stdio.h>
#define NODMAX 400100
int n, q, x;
int type, a, b;
int mx, v[NODMAX];
void Actualizare(int, int, int, int, int);
void Interogare (int, int, int, int, int);
int main() {
int i;
FILE *f = fopen("arbint.in", "r");
FILE *g = fopen("arbint.out", "w");
fscanf(f, "%d %d\n", &n, &q);
for(i = 1 ; i <= n ; ++i) {
fscanf(f, "%d\n", &x);
Actualizare(x, i, 1, n, 1);
}
while(q--) {
fscanf(f, "%d %d %d\n", &type, &a, &b);
if(type == 0) {
mx = 0;
Interogare(a, b, 1, n, 1);
fprintf(g, "%d\n", mx);
}
else {
Actualizare(b, a, 1, n, 1);
}
}
return 0;
}
void Actualizare(int val, int poz, int st, int dr, int nod) {
if(st == dr) {
v[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
Actualizare(val, poz, st, mij, 2 * nod);
else Actualizare(val, poz, mij + 1, dr, 2 * nod + 1);
if(v[2 * nod] > v[2 * nod + 1])
v[nod] = v[2 * nod];
else v[nod] = v[2 * nod + 1];
}
void Interogare(int a, int b, int st, int dr, int nod) {
if(st >= a && dr <= b) {
if(v[nod] > mx)
mx = v[nod];
return;
}
int mij = (st + dr) / 2;
if(a <= mij)Interogare(a, b, st, mij, nod * 2);
if(b > mij)Interogare(a, b, mij + 1, dr, nod * 2 + 1);
}