#include <fstream.h>
#define Nm (1<<17)
int v[Nm], arb[Nm<<1], n, m, i;
int x, y, z;
long rez;
//fnctia de update
void update (int nod, int in, int sf, int poz, int val)
{
if (in == sf)
{
arb[nod] = val;
return;
}
int mj;
mj = (in + sf) / 2;
if (poz <= mj)
update (2*nod, in, mj, poz, val);
else
update (2*nod+1, mj+1, sf, poz, val);
if (arb[2*nod] > arb[2*nod+1])
arb[nod] = arb[2*nod];
else
arb[nod] = arb[2*nod+1];
}
//functia de maxim pe intervalul [a, b]
void query (int nod, int in, int sf, int a, int b)
{
if (a <= in && sf <= b)
{
if (arb[nod] > rez)
rez = arb[nod];
return;
}
int mj;
mj = (in + sf) / 2;
if (a <= mj)
query (2*nod, in, mj, a, b);
if (mj+1 <= b)
query (2*nod+1, mj+1, sf, a, b);
}
int main()
{
ifstream fin("arbint.in");
ofstream fout ("arbint.out");
fin >> n >> m;
for (i=1; i<=n; i++)
{
fin >> v[i];
update (1, 1, n, i, v[i]);
}
for (i=1; i<=m; i++)
{
fin >> x >> y >> z;
if (x == 0)
{
rez = -1;
query (1, 1, n, y, z);
fout << rez << '\n';
}
else
update (1, 1, n, y, z);
}
fin.close();
fout.close();
return 0;
}