#include <bits/stdc++.h>
#define N_MAX 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int tree[4 * N_MAX];
void update(int node, int left, int right, int pos, int val)
{
if (left == right)
{
tree[node] = val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid)
update(2 * node, left, mid, pos, val);
else
update(2 * node + 1, mid + 1, right, pos, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void query(int node, int left, int right, int a, int b, int &MI)
{
if (a <= left && right <= b)
{
MI = max(MI, tree[node]);
return;
}
int mid = (left + right) / 2;
if (a <= mid)
query(2 * node, left, mid, a, b, MI);
if (b > mid)
query(2 * node + 1, mid + 1, right, a, b, MI);
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
int x;
fin >> x;
update(1, 1, n, i, x);
}
while (m--)
{
int t, x, y;
fin >> t >> x >> y;
if (t == 1)
{
update(1, 1, n, x, y);
}
else
{
int rez = -1;
query(1, 1, n, x, y, rez);
fout << rez << "\n";
}
}
return 0;
}