#include <stdio.h>
#define DIMENSIUNE_ARBORE 262144
#define maxim(x, y) (x > y ? x : y)
int A[DIMENSIUNE_ARBORE], n, m;
void update(int nod, int li, int ls, int poz, int val)
{
if(li == ls) A[nod] = val;
else
{
int m = (li + ls) / 2;
if(poz <= m) update(2 * nod, li, m, poz, val);
else update(2 * nod + 1, m + 1, ls, poz, val);
A[nod] = maxim(A[2 * nod], A[2 * nod + 1]);
}
}
int querry(int nod, int li, int ls, int a, int b)
{
if(a <= li && ls <= b) return A[nod];
else
{
int q1 = -1, q2 = -1, m;
m = (li + ls) / 2;
if(a <= m) q1 = querry(2 * nod, li, m, a, b);
if(b > m) q2 = querry(2 * nod + 1, m + 1, ls, a, b);
return maxim(q1, q2);
}
}
int main()
{
FILE* fi = fopen("arbint.in", "r");
FILE* fo = fopen("arbint.out", "w");
int i, op, x, y;
fscanf(fi, "%d%d", &n, &m);
for(i = 1; i <= n; ++i)
{
fscanf(fi, "%d", &x);
update(1, 1, n, i, x);
}
while(m--) //pentru fiecare operatie
{
fscanf(fi, "%d%d%d", &op, &x, &y);
if(op) update(1, 1, n, x, y);
else fprintf(fo, "%d\n", querry(1, 1, n, x, y));
}
fclose(fi);
fclose(fo);
return 0;
}