#include <fstream>
#define dim 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[4 * dim], v[dim], n, m;
int x, y;
void build(int st, int dr, int nod);
void update(int st, int dr, int nod);
int query(int st, int dr, int nod);
int main()
{
int i, caz;
fin >> n >> m;
for (i = 1; i <= n; i++)
fin >> v[i];
build(1, n, 1);
for (i = 1; i <= m; i++) {
fin >> caz >> x >> y;
if (caz == 0)
fout << query(1, n, 1) << "\n";
else
update(1, n, 1);
}
return 0;
}
void build(int st, int dr, int nod)
{
if (st == dr)
a[nod] = v[st];
else {
int mij = (st + dr) / 2;
build(st, mij, nod * 2);
build(mij + 1, dr, nod * 2 + 1);
if (a[nod * 2] > a[nod * 2 + 1])
a[nod] = a[nod * 2];
else
a[nod] = a[nod * 2 + 1];
}
}
void update(int st, int dr, int nod)
{
if (st == dr)
a[nod] = y;
else {
int mij = (st + dr) / 2;
if (x <= mij)
update(st, mij, nod * 2);
else
update(mij + 1, dr, nod * 2 + 1);
if (a[nod * 2] > a[nod * 2 + 1])
a[nod] = a[nod * 2];
else
a[nod] = a[nod * 2 + 1];
}
}
int query(int st, int dr, int nod)
{
if (x <= st and dr <= y)
return a[nod];
else {
int a1, a2, mij = (st + dr) / 2;
if (y <= mij)
return query(st, mij, nod * 2);
if (x >= mij + 1)
return query(mij + 1, dr, nod * 2 + 1);
a1 = query(st, mij, nod * 2);
a2 = query(mij + 1, dr, nod * 2 + 1);
if (a1 > a2)
return a1;
else
return a2;
}
}