#include <cstdio>
#define dim 400066
#define buffSize 8192
int N, M, newVal, pos, A, B, maxim;
int MaxArb[dim];
FILE *f = fopen("arbint.in", "r");
char str[buffSize];
inline int Maxim(int a, int b) {
if ( a > b ) return a;
return b;
}
void query(int, int, int);
void update(int, int, int);
inline void readInt(int &val)
{
static int pos = 0, len = 0;
val = 0;
if (pos == len)
{
len = fread(str, sizeof(char), buffSize, f);
pos = 0;
}
while (pos < len && (str[pos] > '9' || str[pos] < '0'))
{
++pos;
if (pos == len)
{
len = fread(str, sizeof(char), buffSize, f);
pos = 0;
}
}
while (pos < len && (str[pos] <= '9' && str[pos] >= '0'))
{
val = val * 10 + str[pos] - '0';
pos++;
if (pos == len)
{
len = fread(str, sizeof(char), buffSize, f);
pos = 0;
}
}
}
int main()
{
int a, x, y;
freopen("arbint.out","w",stdout);
//scanf("%d %d", &N, &M);
readInt(N);readInt(M);
for (int i = 1 ; i <= N ; ++i)
{
//scanf("%d", &newVal);
readInt(newVal);
pos = i;
update(1, 1, N);
}
for (int i = 1 ; i <= M ; ++i)
{
//scanf("%d %d %d", &a, &x, &y);
readInt(a);readInt(x);readInt(y);
if (a == 0)
{
maxim = -1;
A = x;B = y;
query(1, 1, N);
printf("%d\n", maxim);
}
else
{
newVal = y;
pos = x;
update(1, 1, N);
}
}
return 0;
}
void query(int node, int st, int dr)
{
if (st >= A && dr <= B)
{
if (MaxArb[node] > maxim)
maxim = MaxArb[node];
return;
}
int mid = (st + dr) >> 1;
if (A <= mid) query((node << 1), st, mid);
if (B > mid) query((node << 1) | 1, mid + 1, dr);
}
void update(int node, int st, int dr)
{
if (st == dr)
{
MaxArb[node] = newVal;
return;
}
int mid = (st + dr) >> 1;
if (pos <= mid)
update(node << 1, st, mid);
else
update((node << 1) | 1, mid + 1, dr);
MaxArb[node] = Maxim(MaxArb[node << 1], MaxArb[(node << 1) | 1]);
}