#include <stdio.h>
#define NMax 100005
#define maxim(a, b) ( (a > b) ? a : b )
int n, m, ar[4*NMax];
void update(int nod, int in, int sf, int pos, int val);
int querry(int nod, int in, int sf, int a, int b);
int main()
{
int i, x, t, a, b;
FILE *fin = fopen("arbint.in", "rt");
FILE *fout = fopen("arbint.out", "wt");
fscanf(fin, "%d %d", &n, &m);
for (i = 1; i <= n; i++)
{
fscanf(fin, "%d", &x);
update(1, 1, n, i, x);
}
for (i = 1; i <= m; i++)
{
fscanf(fin, "%d %d %d", &t, &a, &b);
if (t)
{
update(1, 1, n, a, b);
}
else
{
int rez = querry(1, 1, n, a, b);
fprintf(fout, "%d\n", querry(1, 1, n, a, b));
}
}
fclose(fin);
fclose(fout);
return 0;
}
int mi;
void update(int nod, int in, int sf, int pos, int val)
{
if (in == sf)
{
ar[nod] = val;
}
else
{
mi = (in + sf) / 2;
if (pos <= mi)
update(2*nod, in, mi, pos, val);
else
update(2*nod+1, mi+1, sf, pos, val);
ar[nod] = maxim(ar[2*nod], ar[2*nod+1]);
}
}
int querry(int nod, int in, int sf, int a, int b)
{
if (a <= in && b >= sf)
return ar[nod];
int mi = (in + sf) / 2;
if (a <= mi && b >= mi + 1)
return maxim(querry(2*nod, in, mi, a, b), querry(2*nod+1, mi+1, sf, a, b));
if (a <= mi)
return querry(2*nod, in, mi, a, b);
//if (b >= mi + 1)
return querry(2*nod+1, mi+1, sf, a, b);
}