#include <cmath>
#include <cstdio>
#include <iostream>
#define MaxN 100005
#define EPS 1e-12
using namespace std;
int T[3 * MaxN], v[MaxN], N, M;
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, int pos, int val) {
if (st == dr) {
T[node] = val;
} else {
int mid = (st + dr) / 2;
if (pos <= mid) {
update(2 * node, st, mid, pos, val);
} else {
update(2 * node + 1, mid + 1, dr, pos, val);
}
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
int query(int node, int st, int dr, int start, int end) {
if (start <= st && dr <= end) {
return T[node];
} else {
int mid = (st + dr) / 2;
int ans = -1;
if (start <= mid) {
ans = max(ans, query(2 * node, st, mid, start, end));
}
if (mid + 1 <= end) {
ans = max(ans, query(2 * node + 1, mid + 1, dr, start, end));
}
return ans;
}
}
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) {
update(1, 1, N, a, b);
} else {
cout << query(1, 1, N, a, b) << endl;
}
}
return 0;
}