#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int MAXN = 100041;
int n, m;
int sir[MAXN], arbint[4 * MAXN];
void citire()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
in >> sir[i];
}
void constructie(int st, int dr, int nod = 1)
{
if(st == dr)
{
arbint[nod] = sir[st];
return;
}
int mij = (st + dr) / 2;
constructie(st, mij, nod << 1);
constructie(mij + 1, dr, nod << 1 | 1);
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}
int query(int qst, int qdr, int st = 1, int dr = n, int nod = 1)
{
if(qst <= st && dr <= qdr)
{
return arbint[nod];
}
int mij = (st + dr) >> 1;
int maxi = -1;
if(mij >= qst)
maxi = max(maxi, query(qst, qdr, st, mij, nod << 1));
if (qdr > mij)
maxi = max(maxi, query(qst, qdr, mij+1, dr, nod<<1 | 1));
return maxi;
}
void update(int pos, int val, int st = 1, int dr = n, int nod = 1)
{
if (st == dr)
arbint[nod] = val;
else
{
int mij = (st+dr) >> 1;
if (pos <= mij)
update(pos, val, st, mij, nod<<1);
else
update(pos, val, mij+1, dr, nod<<1 | 1);
arbint[nod] = max(arbint[nod<<1], arbint[nod<<1|1]);
}
}
int main()
{
citire();
constructie(1, n);
//
// for(int i = 1; i <= 9 ; i++)
// cout << arbint[i] << " ";
for(int i = 1; i <= m; i++)
{
int op, a, b;
in >> op >> a >> b;
if(op == 0)
{
out << query(a, b) << '\n';
}
else
{
update(a, b);
}
}
return 0;
}