#include <fstream>
using namespace std;
const int NMAX = 100000;
int v[1 + NMAX];
int aint[1 + 4 * NMAX];
void buildAint(int index, int st, int dr)
{
if (st == dr)
{
aint[index] = v[st];///= v[dr];
return;
}
int mij = (st + dr) / 2;
int fiuSt = 2 * index;
int fiuDr = 2 * index + 1;
buildAint(fiuSt, st, mij);
buildAint(fiuDr, mij + 1, dr);
aint[index] = max(aint[fiuSt], aint[fiuDr]);
}
void updateAint(int index, int st, int dr, int poz, int val)
{
if (st == dr)
{
aint[index] = val;
return;
}
int mij = (st + dr) / 2;
int fiuSt = 2 * index;
int fiuDr = 2 * index + 1;
if (poz <= mij)
updateAint(fiuSt, st, mij, poz, val);
else
updateAint(fiuDr, mij + 1, dr, poz, val);
aint[index] = max(aint[fiuSt], aint[fiuDr]);
}
int queryAint(int index, int st, int dr, int stQ, int drQ)
{
if (st == stQ && drQ == dr)
return aint[index];
int mij = (st + dr) / 2;
int fiuSt = 2 * index;
int fiuDr = 2 * index + 1;
if (drQ <= mij)
return queryAint(fiuSt, st, mij, stQ, drQ);
else if (mij + 1 <= stQ)
return queryAint(fiuDr, mij + 1, dr, stQ, drQ);
else
return max(queryAint(fiuSt, st, mij, stQ, mij), queryAint(fiuDr, mij + 1, dr, mij + 1, drQ));
}
int main()
{
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
in >> n >> m;
for (int i = 1; i <= n; i++)
in >> v[i];
buildAint(1, 1, n);
for (int j = 1; j <= m; j++)
{
int tip, a, b;
in >> tip >> a >> b;
if (tip == 0)
out << queryAint(1, 1, n, a, b) << '\n';
else
updateAint(1, 1, n, a, b);
}
in.close();
out.close();
return 0;
}