#include<fstream>
#include<algorithm>
#define max(a, b) (a<b?b:a)
#define Nmax 100010
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int i, N, M, A[Nmax],a, b, sol, max=-1;
int poz, x;
void UPDATE(int st, int dr, int nod)
{
if (st == dr)
A[nod] = x;
else
{
int mijl = (st + dr) / 2;
if (poz <= mijl)
UPDATE(st, mijl, nod * 2);
else
UPDATE(mijl + 1, dr, nod * 2 + 1);
A[nod] = max(A[2 * nod], A[2 * nod + 1]);
}
}
void QUERY(int st, int dr, int nod)
{
if (a <= st && b >= dr)
sol = max(sol, A[nod]);
else
{
int mijl = (st + dr) / 2;
if (a <= mijl)
QUERY(st, mijl, nod*2);
if (b >= mijl + 1)
QUERY(mijl + 1, dr, nod * 2 + 1);
}
}
int main()
{
int op;
fin >> N >> M;
for (i = 1; i <= N; i++)
{
fin >> x;
poz = i;
UPDATE(1, N, 1);
}
while (M--)
{
fin>>op>>a>>b;
if (!op){
sol = -1;
QUERY(1, N, 1);
fout<< sol << '\n';
}
else
{
poz = a;
x = b;
UPDATE(1, N, 1);
}
}
return 0;
}/*
#include <iostream>
#include <fstream>
#define max(a, b) (a<b?b:a)
using namespace std;
int A[100014 * 4 + 1], n, m, a, b, x, poz, sol;
void update(int st, int dr, int nod)
{
if (st == dr)
A[nod] = x;
else
{
int mij = (st + dr) / 2;
if (poz <= mij)
update(st, mij, nod * 2);
else
update(mij + 1, dr, nod * 2 + 1);
A[nod] = max(A[2 * nod], A[2 * nod + 1]);
}
}
void query(int st, int dr, int nod)
{
if (a <= st && b >= dr)
sol = max(sol, A[nod]);
else
{
int mij = (st + dr) / 2;
if (a <= mij)
query(st, mij, nod * 2);
if (b >= mij + 1)
query(mij + 1, dr, nod * 2 + 1);
}
}
int main()
{
int i, var;
fstream f, g;
f.open("arbint.in", ios::in);
g.open("arbint.out", ios::out);
f >> n >> m;
for (i = 1; i <= n; i++)
{
f >> x;
poz = i;
update(1, n, 1);
}
for (i = 1; i <= m; i++)
{
f >> var >> a >> b;
if (var == 0)
{
sol = -1;
query(1, n, 1);
g << sol << '\n';
}
else
{
poz = a;
x = b;
update(1, n, 1);
}
}
return 0;
}*/