#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;
const int dim = 100001;
int N,
M;
int arb[4*dim+66];
int val,
pos,
p,
r,
maxim;
#define MAX(a, b) ((a > b) ? (a) : (b))
void update(int nod, int left, int right) {
if (left == right) {
arb[nod] = val;
return;
}
int q = (left+right)/2;
if (pos <= q)
update(2*nod, left, q);
else
update(2*nod+1, q+1, right);
arb[nod] = MAX(arb[2*nod], arb[2*nod+1]);
}
void query(int nod, int left, int right) {
if ((p <= left) && (right <= r)) {
if (maxim < arb[nod])
maxim = arb[nod];
return;
}
int q = (left + right) / 2;
if (p <= q)
query(2*nod, left, q);
else
query(2*nod+1, q+1, right);
}
int main(int argc, char *argv[]) {
FILE *fi = fopen("arbint.in", "r");
fscanf(fi, "%d %d", &N, &M);
int aux;
for (int i(1); i <= N; ++i) {
fscanf(fi, "%d", &aux);
pos = i;
val = aux;
update(1, 1, N);
}
int a, b;
FILE *fo = fopen("arbint.out", "w");
for (int i(0); i < M; ++i) {
fscanf(fi, "%d %d %d", &aux, &a, &b);
if (aux == 0) {
maxim = -1;
p = a;
r = b;
query(1, 1, N);
fprintf(fo, "%d\n", maxim);
} else {
pos = a;
val = b;
update(1, 1, N);
}
}
fclose(fo);
fclose(fi);
return 0;
}