#include<fstream>
using namespace std;
int maxim(int a, int b);
void update(int nod,int left, int right, int pos, int val);
void querry(int nod,int left, int right, int start, int finish, int &max);
int maxArb[400071];
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, i, j,a,b,op,max;
f >> n >> m;
for (i = 1; i <= n; i++)
{
f >> a;
update(1, 1,n, i, a);
}
for (i = 1; i <= m; i++)
{
f >> op >> a >> b;
if (op == 0)
{
max = -1;
querry(1, 1, n, a, b, max);
g << max << "\n";
}
else
update(1, 1, n, a, b);
}
}
int maxim(int a, int b)
{
if (a > b) return a;
return b;
}
void update(int nod, int left, int right, int pos, int val)
{
if (left == right)
{
maxArb[nod] = val;
return;
}
int div = (left + right) / 2;
if (pos <= div) update(2 * nod, left, div, pos, val);
else
update(nod * 2 + 1, div + 1, right, pos, val);
maxArb[nod] = maxim(maxArb[nod * 2], maxArb[nod * 2 + 1]);
}
void querry(int nod, int left, int right, int start, int finish,int &max)
{
if (left >= start && right <= finish)
{
if (max < maxArb[nod]) max = maxArb[nod];
return;
}
int div;
div = (left + right) / 2;
if (start <= div) querry(2 * nod, left, div, start, finish, max);
if (finish > div) querry(2 * nod + 1, div + 1, right, start, finish, max);
}