#include<iostream>
#include<vector>
#include<fstream>
#define MAXN 100010
using namespace std;
int v[MAXN];
int tree[4 * MAXN];
int n, m;
ifstream f("arbint.in");
ofstream g("arbint.out");
void updateTree(int idx, int l, int r, int pos, int val)
{
if (l==r)
{
tree[idx] = val;
return;
}
int m = (l + r) / 2;
if (pos <= m)
updateTree(2 * idx, l, m, pos, val);
else
updateTree(2 * idx + 1, m + 1, r, pos, val);
tree[idx] = max(tree[2 * idx], tree[2 * idx + 1]);
}
int query(int idx, int l, int r, int ql, int qr)
{
if (l > qr || r < ql)
return -10;
if (l >= ql && r <= qr)
return tree[idx];
int m = (l + r) / 2;
return max(query(2 * idx, l, m, ql, qr), query(2 * idx + 1, m + 1, r, ql, qr));
}
int main()
{
ios_base::sync_with_stdio(false);
f.tie(0);
f >> n >> m;
for (int i = 1; i <= n; i++)
{
f >> v[i];
updateTree(1, 1, n, i, v[i]);
}
while (m--)
{
int op, a, b;
f >> op >> a >> b;
if (op == 1)
updateTree(1, 1, n, a, b);
else
g << query(1, 1, n, a, b) << '\n';
}
}