#include <stdio.h>
#define MAX 100001
int n, m;
int T[4*MAX+4];
void update(int nod, int st, int dr, int a, int b, int val);
int query(int nod, int st, int dr, int a, int b);
int main()
{
int i1, i2, nr, poz, op;
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
fscanf(fin, "%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
fscanf(fin, "%d", &nr);
update(1, 1, n, i, i, nr);
}
for (int i = 0; i < m; ++i)
{
fscanf(fin, "%d", &op);
if (op == 0)
{
fscanf(fin, "%d%d", &i1, &i2);
fprintf(fout, "%d\n", query(1, 1, n, i1, i2));
}
else
{
fscanf(fin, "%d%d", &poz, &nr);
update(1, 1, n, poz, poz, nr);
}
}
fclose(fin);
fclose(fout);
return 0;
}
void update(int nod, int st, int dr, int a, int b, int val)
{
if (st == dr && st == a && st == b)
T[nod] = val;
else
{
int mijl = (st + dr) >> 1;
if (a <= mijl)
update(2*nod, st, mijl, a, b, val);
if (b > mijl)
update(2*nod+1, mijl+1, dr, a, b, val);
if (T[2*nod] > T[2*nod+1])
T[nod] = T[2*nod];
else
T[nod] = T[2*nod+1];
}
}
int query(int nod, int st, int dr, int a, int b)
{
int ret1 = 0, ret2 = 0;
if (a <= st && dr <= b)
return T[nod];
else
{
int mijl = (st + dr) >> 1;
if (a <= mijl)
ret1 = query(2*nod, st, mijl, a, b);
if (b > mijl)
ret2 = query(2*nod+1, mijl+1, dr, a, b);
if (ret1 > ret2)
return ret1;
else
return ret2;
}
return ret1;
}