#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m, v[100001], A[1000001];
void build (int nod, int st, int dr) {
int Max = 0;
for (int i = st; i <= dr; i++)
Max = max (Max, v[i]);
A[nod] = Max;
if (st < dr) {
int mid = (st + dr) / 2;
build (nod * 2, st, mid);
build (nod * 2 + 1, mid + 1, dr);
}
}
void querry (int nod, int st, int dr, const int a, const int b, int& sol) {
if (a <= st && b >= dr) {
sol = max (sol, A[nod]);
}
else {
int mid = (st + dr) / 2;
if (a <= mid) {
querry (nod * 2, st, mid, a, b, sol);
}
if (b >= mid + 1) {
querry (nod * 2 + 1, mid + 1, dr, a, b, sol);
}
}
}
void update (int nod, int st, int dr, const int p, const int x) {
if (st == dr) {
A[nod] = x;
}
else {
int mid = (st + dr) / 2;
if (p <= mid)
update (nod * 2, st, mid, p ,x);
else
update (nod * 2+ 1, mid + 1, dr, p, x);
A[nod] = max (A[2 * nod], A[2 * nod + 1]);
}
}
int main () {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
build (1, 1, n);
for (int i = 1; i <= m; i++) {
int c, a, b;
fin >> c >> a >> b;
if (c) {
update (1, 1, n, a, b);
}
else {
querry (1, 1, n, a, b, c);
fout << c << "\n";
}
}
return 0;
}