#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[100000 * 5 + 30];
void update(int el, int x, int y, int val, int k)
{
int mid = (x + y) / 2;
if (x == y && el == y)
{
arb[k] = val;
return;
}
else if (el <= mid)
update(el, x, mid, val, k * 2);
else
update(el, mid + 1, y, val, k * 2 + 1);
arb[k] = max(arb[k * 2], arb[k * 2 + 1]);
}
int query(int a, int b, int x, int y, int k)
{
int mid = (x + y) / 2,e1=-1,e2=-1;
if (x == a && b == y)
return arb[k];
if (a <= mid)
e1=query(a, min(b,mid), x, mid, k * 2);
if (b > mid)
e2=query(max(mid+1,a), b, mid + 1, y, k * 2 + 1);
return max(e1, e2);
}
int main()
{
int N, Q;
in >> N >> Q;
for (int i = 1;i <= N;++i)
{
int e;
in >> e;
update(i, 1, N, e, 1);
}
for (int i = 1;i <= Q;++i)
{
int op,a , b;
in >> op >> a >> b;
if (!op)
out << query(a, b, 1, N, 1) << '\n';
else
update(a, 1, N, b, 1);
}
return 0;
}