#include <algorithm>
#include <cstdio>
#define MaxN 100005
using namespace std;
int n, m, v[MaxN], t[3 * MaxN], val, pos, Start, End;
void Build(int node, int s, int e) {
if (s == e) {
t[node] = v[s];
} else {
int mid = (s + e) / 2;
Build(2 * node, s, mid);
Build(2 * node + 1, mid + 1, e);
t[node] = max(t[2 * node], t[2 * node + 1]);
}
}
void Update(int node, int s, int e) {
if (s == e) {
t[node] = val;
} else {
int mid = (s + e) / 2;
if (pos <= mid)
Update(2 * node, s, mid);
else
Update(2 * node + 1, mid + 1, e);
t[node] = max(t[2 * node], t[2 * node + 1]);
}
}
void Query(int node, int s, int e) {
if (Start <= s && e <= End) {
val = max(val, t[node]);
} else {
int mid = (s + e) / 2;
if (Start <= mid)
Query(2 * node, s, mid);
if (End > mid)
Query(2 * node + 1, mid + 1, e);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
Build(1, 1, n);
for (int i = 1; i <= m; i++) {
int tip, a, b;
scanf("%d%d%d", &tip, &a, &b);
if (tip == 0) {
Start = a;
End = b;
val = 0;
Query(1, 1, n);
printf("%d\n", val);
} else {
pos = a;
val = b;
Update(1, 1, n);
}
}
return 0;
}