#include<fstream>
#define maxn 10010
#define inf 1<<30
int aint[maxn];
int n, m;
int best = -inf;
int maxim(int a, int b)
{
if (a > b)
return a;
return b;
}
void Update(int nod, int left, int right,int poz, int val)
{
/*daca am ajuns la un interval format dintr-un singur element*/
if (left == right)
{
aint[nod] = val;
return;
}
int mid = (left + right) / 2;
/*vad daca trebuie sa ma duc in fiul stang sau drept*/
if (poz <= mid)
Update(2 * nod,left, mid, poz, val);
else
Update(2 * nod + 1 ,mid + 1, right, poz, val);
/*maximul din nodul curent este egal cu maximul dintre nodurile fiilor*/
aint[nod] = maxim(aint[nod * 2], aint[nod * 2 + 1]);
}
void Query(int nod, int left, int right, int start, int finish)
{
if (start <= left && right <= finish)
{
best = maxim(best, aint[nod]);
return;
}
int mid = (left + right) / 2;
if (start <= mid)
Query(2 * nod, left, mid, start, finish);
else
Query(2 * nod + 1, mid + 1, right, start, finish);
}
int main()
{
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
in >> n >> m;
int x, y, z;
for (int i = 1; i <= n; i++)
{
in >> x;
Update(1, 1, n, i, x);
}
for (int i = 1; i <= m; i++)
{
in >> x >> y >> z;
if (x == 0)
{
best = -inf;
Query(1, 1, n, y, z);
out << best << "\n";
}
if (x == 1)
{
Update(1, 1, n, y, z);
}
}
}