#include <cstdio>
#define MAX 100001
#define maxi(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
int s[2*MAX+1], maxim, n, m;
void Update(int nod, int st, int dr, int p, int v);
void Querry(int nod, int st, int dr, int a, int b);
int main()
{
int i, op, x1, x2;
FILE * fin = fopen("arbint.in", "r");
FILE * fout = fopen("arbint.out", "w");
fscanf(fin, "%d %d", &n, &m);
for (i = 1; i <= n; i++)
{
fscanf(fin, "%d", &x1);
Update(1, 1, n, i, x1);
}
int q;
for (q = 1; q <= m; q++)
{
fscanf(fin, "%d %d %d", &op, &x1, &x2);
if (op == 0)
{
maxim = 0;
Querry(1, 1, n, x1, x2);
fprintf(fout, "%d\n", maxim);
}
else Update(1, 1, n, x1, x2);
}
fclose(fin);
fclose(fout);
return 0;
}
void Update(int nod, int st, int dr, int p, int v)
{
if (st == dr)
{
s[nod] = v;
return;
}
int mijl = (st+dr)/2;
if (p <= mijl) Update(2*nod, st, mijl, p, v);
if (mijl < p) Update(2*nod+1, mijl+1, dr, p, v);
s[nod] = maxi(s[2*nod], s[2*nod+1]);
}
void Querry(int nod, int st, int dr, int a, int b)
{
if (a <= st && dr <= b)
{
maxim = maxi(maxim, s[nod]);
return;
}
int mijl = (st+dr)/2;
if (a <= mijl) Querry(2*nod, st, mijl, a, b);
if (b > mijl) Querry(2*nod+1, mijl+1, dr, a, b);
}