#include <bits/stdc++.h>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
const int maxn = 1e5;
int n, v[maxn + 1], tree[maxn * 4 + 1];
void dfs(int node, int left, int right) {
if (left == right) {
tree[ node ] = v[ left ];
return;
}
int middle = (left + right)/2;
dfs(node * 2, left, middle);
dfs(node * 2 + 1, middle + 1, right);
tree[ node ] = max(tree[node * 2], tree[node * 2 + 1]);
}
int query(int node, int left, int right, int x, int y) {
if (left >= x && right <= y) {
return tree[ node ];
}
int q1 = 0, q2 = 0, middle = (left + right)/2;
if (x <= middle) {
q1 = query(node*2, left, middle, x, y);
}
if (y > middle) {
q2 = query(node*2 + 1, middle+1, right, x, y);
}
return max(q1, q2);
}
void update(int node, int left, int right, int x, int y) {
if (left == right) {
tree[ node ] = y;
return;
}
int middle = (left + right)/2;
if (x <= middle) {
update(node*2, left, middle, x, y);
}
else {
update(node*2 + 1, middle + 1, right, x, y);
}
tree[ node ] = max(tree[node*2], tree[node*2+1]);
}
int main()
{
int q, a, b, o;
fi >> n >> q;
for (int i = 1; i <= n; i++) {
fi >> v[ i ];
}
dfs(1, 1, n);
while (q--) {
fi >> o >> a >> b;
if (o == 0) {
fo << query(1, 1, n, a, b) << '\n';
}
else {
update(1, 1, n, a, b);
}
}
fi.close();
fo.close();
return 0;
}