#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
void Build(int *T, int *v, int node, int Start, int End) {
if (Start == End) {
T[node] = v[Start];
} else {
int mid = (Start + End) / 2;
Build(T, v, 2 * node, Start, mid);
Build(T, v, 2 * node + 1, mid + 1, End);
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void Update(int *T, int node, int Start, int End, int Val, int Pos) {
if (Start == End) {
T[node] = Val;
} else {
int mid = (Start + End) / 2;
if (Pos <= mid) {
Update(T, 2 * node, Start, mid, Val, Pos);
} else {
Update(T, 2 * node + 1, mid + 1, End, Val, Pos);
}
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
int Query(int *T, int node, int Start, int End, int L, int R) {
if (L <= Start && End <= R) {
return T[node];
} else {
int mid = (Start + End) / 2;
int ans = 0;
if (L <= mid) {
ans = max(ans, Query(T, 2 * node, Start, mid, L, R));
}
if (R > mid) {
ans = max(ans, Query(T, 2 * node + 1, mid + 1, End, L, R));
}
return ans;
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, Q;
int v[NMAX] = {};
int T[4 * NMAX] = {};
scanf("%d%d", &N, &Q);
for (int i = 1; i <= N; i++) {
scanf("%d", &v[i]);
}
Build(T, v, 1, 1, N);
for (int i = 1; i <= Q; i++) {
int type, x, y;
cin >> type >> x >> y;
if (type == 1) {
Update(T, 1, 1, N, y, x);
} else {
printf("%d\n", Query(T, 1, 1, N, x, y));
}
}
return 0;
}