#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NX 100005
#define NXARB 262144
int a[NX], t[NXARB];
inline int maxim(int left, int right)
{
int max = -1;
for (int i = left; i <= right; i++)
{
if (max < a[i])
max = a[i];
}
return max;
}
inline int MaximTwoElems(int a, int b) {
if (a > b)
return a;
return b;
}
int createArbInt(int nod, int st, int dr, int a, int b)
{
if (a <= st && dr <= b)
{
t[nod] = maxim(st, dr);
return t[nod];
}
else
{
int mij = (st + dr) / 2;
int val1 = t[2 * nod], val2 = t[2 * nod + 1];
if (a <= mij)
{
val1 = createArbInt(2 * nod, st, mij, a, b);
}
if (b > mij)
{
val2 = createArbInt(2 * nod + 1, mij + 1, dr, a, b);
}
t[nod] = MaximTwoElems(val1, val2);
return t[nod];
}
}
int query(int nod, int st, int dr, int a, int b)
{
if (a <= st && dr <= b)
{
return t[nod];
}
else
{
int mij = (st + dr) / 2;
int val1 = 0, val2 = 0;
if (a <= mij)
{
val1 = query(2 * nod, st, mij, a, b);
}
if (b > mij)
{
val2 = query(2 * nod + 1, mij + 1, dr, a, b);
}
return MaximTwoElems(val1, val2);
}
}
int main()
{
int N, M, op, an, bn, j = 1;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
int sqrtN = sqrt((double)N);
for (int i = 1; i <= N; i++)
{
scanf("%d", &a[i]);
}
for (int i = 1; i <= N; i++)
{
createArbInt(1, 1, N, i, i);
}
for (int i = 1; i <= M; i++)
{
scanf("%d %d %d\n", &op, &an, &bn);
switch (op)
{
case 0:
printf("%d\n", query(1, 1, N, an, bn));
break;
case 1:
a[an] = bn;
createArbInt(1, 1, N, an, an);
break;
}
}
}