#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 100005;
int tree[4 * MAXN], inp[MAXN], n, m;
void create(int left, int right, int ind)
{
if (left == right) {
tree[ind] = inp[left];
return;
}
int mid = left + (right - left) / 2;
create(left, mid, 2 * ind);
create(mid + 1, right, 2 * ind + 1);
tree[ind] = max(tree[2 * ind], tree[2 * ind + 1]);
}
void update(int left, int right, int ind, int val, int pos)
{
if (left == right) {
tree[ind] = val;
return;
}
int mid = left + (right - left) / 2;
if (pos <= mid)
update(left, mid, 2 * ind, val, pos);
else
update(mid + 1, right, 2 * ind + 1, val, pos);
tree[ind] = max(tree[2 * ind], tree[2 * ind + 1]);
}
int query(int left, int right, int ind, int x, int y)
{
if (left >= x && right <= y)
return tree[ind];
int mid = left + (right - left) / 2, lSon = 0, rSon = 0;
if (x <= mid)
lSon = query(left, mid, 2 * ind, x, y);
if (y > mid)
rSon = query(mid + 1, right, 2 * ind + 1, x, y);
return max(lSon, rSon);
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> inp[i];
create(1, n, 1);
for (int i = 0; i < m; ++i) {
int type, x, y;
fin >> type >> x >> y;
if (type == 0)
fout << query(1, n, 1, x, y) << '\n';
else
update(1, n, 1, y, x);
}
return 0;
}