#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
const int MAXP = 131072;
int aint[2 * MAXP], v[MAXN + 1];
int rez;
int maxim(int a, int b) {
return a > b ? a : b;
}
void build(int nod, int st, int dr) {
int mid;
if (st == dr) {
aint[nod] = v[st];
} else {
mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
aint[nod] = maxim(aint[2 * nod], aint[2 * nod + 1]);
}
}
void update(int nod, int st, int dr, int p) {
int mid;
if (st == dr) {
aint[nod] = v[p];
} else {
mid = (st + dr) / 2;
if (p <= mid) {
update(2 * nod, st, mid, p);
} else {
update(2 * nod + 1, mid + 1, dr, p);
}
aint[nod] = maxim(aint[2 * nod], aint[2 * nod + 1]);
}
}
void query(int nod, int st, int dr, int x, int y) {
int mid;
if (x <= st && y >= dr) {
rez = maxim(rez, aint[nod]);
} else {
mid = (st + dr) / 2;
if (x <= mid) {
query(2 * nod, st, mid, x, y);
}
if (y > mid) {
query(2 * nod + 1, mid + 1, dr, x, y);
}
}
}
int main()
{
FILE *fin, *fout;
int n, m, i, cer, st, dr;
fin = fopen("arbint.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i = 1; i <= n; i++) {
fscanf(fin, "%d", &v[i]);
}
build(1, 1, n);
fout = fopen("arbint.out", "w");
for (i = 0; i < m; i++) {
fscanf(fin, "%d%d%d", &cer, &st, &dr);
if (cer == 0) {
rez = 0;
query(1, 1, n, st, dr);
fprintf(fout, "%d\n", rez);
} else {
v[st] = dr;
update(1, 1, n, st);
}
}
fclose(fin);
fclose(fout);
return 0;
}