#include <iostream>
#include <cstdio>
#define nmax 100005
using namespace std;
FILE *fi, *fo;
int n, m;
int val, pos, a, b, maxim;
int ARB[4*nmax];
void update(int nod, int st, int dr)
{
if (st == dr)
{
ARB[nod] = val;
return;
}
int mid = (st + dr) >> 1;
if (pos <= mid) update(2 * nod, st, mid);
else update(2 * nod + 1, mid + 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 mid = (st + dr) >> 1;
if (a <= mid) query(2 * nod, st, mid);
if (b > mid) query(2 * nod + 1, mid + 1, dr);
}
int main()
{
fi = fopen("arbint.in", "r");
fo = fopen("arbint.out", "w");
fscanf(fi, "%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
int x;
fscanf(fi, "%d", &x);
val = x;
pos = i;
update(1, 1, n);
}
for (int i = 1; i <= m; i++)
{
int tip, x, y;
fscanf(fi, "%d%d%d", &tip, &x, &y);
if (!tip)
{
maxim = -1;
a = x, b = y;
query(1, 1, n);
fprintf(fo, "%d\n", maxim);
}
else
{
pos = x, val = y;
update(1, 1, n);
}
}
fclose(fi);
fclose(fo);
return 0;
}