#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M, maxim;
int V[100005];
int AINT[1 << 18];
void updateinit(int nod, int lt, int rt)
{
if (lt == rt)
{
AINT[nod] = V[lt];
return;
}
int mid = (lt + rt) / 2;
updateinit(nod * 2, lt, mid);
updateinit(nod * 2 + 1, mid + 1, rt);
AINT[nod] = max(AINT[nod * 2], AINT[nod * 2 + 1]);
}
void query(int nod, int lt, int rt, int start, int finish)
{
if (start <= lt && rt <= finish)
{
maxim = max(maxim, AINT[nod]);
return;
}
if (lt == rt)
return;
int mid = (lt + rt) / 2;
if (start <= mid)
query(nod * 2, lt, mid, start, finish);
if (mid < finish)
query(nod * 2 + 1, mid + 1, rt, start, finish);
}
void update(int nod, int lt, int rt, int pos, int val)
{
if (lt == rt)
{
AINT[nod] = val;
return;
}
int mid = (lt + rt) / 2;
if (pos <= mid)
update(nod * 2, lt, mid, pos, val);
else if (pos > mid)
update(nod * 2 + 1, mid + 1, rt, pos, val);
AINT[nod] = max(AINT[nod * 2], AINT[nod * 2 + 1]);
}
int main()
{
fin >> N >> M;
for (int i = 1; i <= N; ++i)
fin >> V[i];
updateinit(1, 1, N);
int type, a, b;
for (int i = 1; i <= M; ++i)
{
fin >> type >> a >> b;
if (type == 0)
{
maxim = 0;
query(1, 1, N, a, b);
fout << maxim << '\n';
}
else
update(1, 1, N, a, b);
}
fout << '\n';
fin.close();
fout.close();
return 0;
}