// arbint.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include <fstream>
#include <cstdio>
#include <string.h>
using namespace std;
class arbint
{
private:
int a[400010];
int nre;
public:
arbint(int n)
{
nre = n;
memset(a, 0, 200000);
}
void update(int node, int st, int dr, int i, int nr)
{
if (st == dr)
{
a[node] = nr;
}
else
{
int mij = (st + dr) / 2;
if (i <= mij)
{
update(node * 2, st, mij, i, nr);
}
else
{
update(node * 2 + 1, mij + 1, dr, i, nr);
}
if (a[node * 2] > a[node * 2 + 1]) a[node] = a[node * 2];
else a[node] = a[node * 2 + 1];
}
}
int maxint(int node, int st, int dr, int x, int y)
{
if (x <= st && dr <= y)
return a[node];
int mij = (st + dr) / 2;
int maxs = 0, maxd = 0;
if (x <= mij)
maxs = maxint(node*2, st, mij, x, y);
if (mij < y)
maxd = maxint(node * 2 + 1, mij + 1, dr, x, y);
if (maxs > maxd) return maxs;
return maxd;
}
};
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, nr, i;
fin >> n >> m;
arbint t(n);
for (i = 1; i <= n; i++)
{
fin >> nr;
t.update(1, 1, n, i, nr);
}
for (i = 1; i <= m; i++)
{
int op, x, y;
fin >> op >> x >> y;
if (op == 0)
{
fout << t.maxint(1, 1, n, x, y) << '\n';
}
else
{
t.update(1, 1, n, x, y);
}
}
return 0;
}