#include <cmath>
#include <cstdio>
#include <iostream>
#define MaxN 100005
#define EPS 1e-12
using namespace std;
int T[3 * MaxN], v[MaxN], N, M, pos, val, Start, End;
void build(int node, int st, int dr) {
if (st == dr) {
T[node] = v[st];
} else {
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void update(int node, int st, int dr) {
if (st == dr) {
T[node] = val;
} else {
int mid = (st + dr) / 2;
if (pos <= mid) {
update(2 * node, st, mid);
} else {
update(2 * node + 1, mid + 1, dr);
}
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void query(int node, int st, int dr) {
if (Start <= st && dr <= End) {
val = max(val, T[node]);
} else {
int mid = (st + dr) / 2;
if (Start <= mid)
query(2 * node, st, mid);
if (mid + 1 <= End)
query(2 * node + 1, mid + 1, dr);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
cin >> v[i];
}
build(1, 1, N);
for (int i = 1; i <= M; i++) {
int tip, a, b;
cin >> tip >> a >> b;
if (tip == 1) {
pos = a;
val = b;
update(1, 1, N);
} else {
Start = a;
End = b;
val = -1;
query(1, 1, N);
cout << val << endl;
}
}
return 0;
}