#include <iostream>
#include <vector>
using namespace std;
vector<int> A, SegTree;
void build(int node, int left, int right)
{
if(left == right)
{
SegTree[node] = A[left];
}
else
{
int mid = (left + right) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
SegTree[node] = max(SegTree[2 * node], SegTree[2 * node + 1]);
}
}
int query(int node, int tl, int tr, int l, int r)
{
if(r < tl || l > tr)
return 0;
if(l <= tl && tr <= r)
return SegTree[node];
int tm = (tl + tr) / 2;
return max(query(2 * node, tl, tm, l, r), query(2 * node + 1, tm + 1, tr, l, r));
}
void update(int node, int l, int r, int idx, int val)
{
if(l == r)
{
A[idx] = val;
SegTree[node] = val;
}
else
{
int mid = (l + r) / 2;
if(l <= idx && idx <= mid)
update(2 * node, l, mid, idx, val);
else
update(2 * node + 1, mid + 1, r, idx, val);
SegTree[node] = max(SegTree[2 * node], SegTree[2 * node + 1]);
}
}
int main(void)
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
cin >> n >> m;
A.resize(n);
for(int i = 0; i < n; i++)
{
cin >> A[i];
}
SegTree.resize(4 * n);
build(1, 0, n - 1);
while(m--)
{
int op, a, b;
cin >> op >> a >> b;
if(op == 0) //query
cout << query(1, 0, n - 1, a - 1, b - 1) << "\n";
else //update
update(1, 0, n - 1, a - 1, b);
}
return 0;
}