#include <fstream>
#include <vector>
using namespace std;
using VI = vector<int>;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, Q;
VI arb;
void CitireDate();
void Arbint();
void Build(int x, int st, int dr);
void Update(int x, int st, int dr, int poz, int val);
int Query(int x, int st, int dr, int a, int b);
int main()
{
CitireDate();
Arbint();
return 0;
}
void Arbint()
{
int op, a, b;
while(Q--)
{
fin >> op >> a >> b;
if (op == 0)
fout << Query(1, 1, n, a, b) << '\n';
if (op == 1)
Update(1, 1, n, a, b);
}
}
void Update(int x, int st, int dr, int poz, int val)
{
if(st == dr)
{
arb[x] = val;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
Update(2 * x, st, mij,
poz, val);
else
Update(2 * x + 1, mij + 1, dr,
poz, val);
arb[x] = max(arb[2 * x],
arb[2 * x + 1]);
}
int Query(int x, int st, int dr, int a, int b)
{
if(st >= a && dr <= b)
return arb[x];
int mx {0}, mij = (st + dr) / 2;
if (a <= mij)
mx = Query(2 * x, st, mij,
a, b);
if (b > mij)
mx = max(mx, // maximul curent
Query(2 * x + 1,
mij + 1, dr,
a, b));
return mx;
}
void Build(int x, int st, int dr)
{
if(st == dr)
{
fin >> arb[x];
return;
}
int mij = (st + dr) / 2;
Build(2 * x, st, mij);
Build(2 * x + 1, mij + 1, dr);
arb[x] = max(arb[2 * x],
arb[2 * x + 1]);
}
void CitireDate()
{
fin >> n >> Q;
arb = VI(4 * n + 1);
Build(1, 1, n);
}