#include <cstdio>
#define DIM 500000
int n, m;
int arb[DIM];
int val, pos, maxim, A, B;
inline int max(const int &a, const int &b)
{
return a<b?b:a;
}
void update(int nod, int st, int dr)
{
if (st == dr)
{
arb[nod] = val;
return;
}
int mij = (st+dr)/2;
if (pos <= mij)
update(2*nod, st, mij);
else
update(2*nod+1, mij+1, dr);
arb[nod] = max( arb[2*nod], arb[2*nod+1]);
}
void query(int nod, int st, int dr)
{
if (A <= st && dr <= B)
{
maxim = max(maxim, arb[nod]);
return ;
}
int mij = (st+dr)/2;
if (A <= mij)
query(2*nod, st, mij);
if (B>mij)
query(2*nod+1, mij+1, dr);
}
int main()
{
FILE *f = fopen("arbint.in", "r");
fscanf(f, "%d%d", &n, &m);
for (int i = 1, x; i <= n; ++i)
{
fscanf(f, "%d", &x);
pos = i;
val = x;
update(1, 1, n);
}
FILE *cacat = fopen("arbint.out", "w");
for (int type;m;--m)
{
fscanf(f, "%d%d%d", &type, &A, &B);
if (type == 0)
{
maxim = -1;
query(1, 1, n);
fprintf(cacat, "%d\n", maxim);
}
else
{
pos = A;
val = B;
update(1, 1, n);
}
}
return 0;
}