#include <cstdio>
#include <iostream>
using namespace std;
FILE* f, * g;
int arbore[400002];
int n, m, where, x, maa;
void ma(int a, int b, int st, int dr, int nod)
{
int mij;
if (a <= st && dr <= b)
{
maa = max(maa, arbore[nod]);
}
else//trebuie sa verific daca intervalul din fiul stang se gaseste in [a;b] sau cel din fiul drept
{
mij = (st + dr) / 2;
if (a <= mij)//caut in fiul stang maximul
ma(a, b, st, mij, 2 * nod);
if (mij < b)//caut si in fiul drept maximul
ma(a, b, mij + 1, dr, 2 * nod + 1);
}
}
void det(int nod, int st, int dr)
{
int mij;
if (st == dr)
{
arbore[nod] = x;
return;
}
else
{
mij = (st + dr) / 2;
if (where <= mij)
det(2 * nod, st, mij);//fiul stang
else
det(2 * nod + 1, mij + 1, dr);//fiul drept
}
arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);//elementul maxim dintre prima jmatate si a 2 a, dintre fiul stang si cel drept
}
int main()
{
f = fopen("arbint.in", "r");
g = fopen("arbint.out", "w");
fscanf(f, "%d %d", &n, &m);
for (int i = 1;i <= n;++i)
{
fscanf(f, "%d", &x);
where = i;//ma ajuta sa vad daca x face parte din fiul stang sau fiul drept
det(1, 1, n);
}
//for(int i=1;i<=10;++i)
// fprintf(g,"%d ",arbore[i]);
int type, a, b;
for (int i = 1;i <= m;++i)
{
fscanf(f, "%d %d %d", &type, &a, &b);
if (type)
{
where = a;
x = b;
det(1, 1, n);
}
else
{
maa = 0;
ma(a, b, 1, n, 1);
fprintf(g, "%d\n", maa);
}
}
fclose(f);
fclose(g);
return 0;
}