#include <cstdio>
using namespace std;
int n, arb[200002], m, v;
FILE* fin=fopen("arbint.in", "r");
FILE* fout=fopen("arbint.out", "w");
int Citire(int nod, int st, int dr, int a, int b)
{
if (a<=st && b>=dr)
return arb[nod];
else
{
int x=0, y=0, mid=(st+dr)/2;
if (a<=mid)
y=Citire(nod*2, st, mid, a, b);
if (b>mid)
x=Citire(nod*2+1, mid+1, dr, a, b);
return max(x, y);
}
}
void Actualizare(int nod, int st, int dr, int poz, int nr)
{
if (st==dr)
{
arb[nod]=nr;
}
else
{
int mid=(st+dr)/2;
if (poz<=mid)
Actualizare(nod*2, st, mid, poz, nr);
else
Actualizare(nod*2+1, mid+1, dr, poz, nr);
arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}
}
int main()
{
fscanf(fin, "%d%d", &n, &m);
for (int i=1; i<=n; i++)
{
fscanf(fin, "%d", &v);
Actualizare(1, 1, n, i, v);
}
for (int i=1; i<=m; i++)
{
int x, a, b;
fscanf(fin, "%d%d%d", &x, &a, &b);
if (!x)
{
fprintf(fout, "%d\n", Citire(1, 1, n, a, b));
}
else
{
Actualizare(1, 1, n, a, b);
}
}
fclose(fin);
fclose(fout);
return 0;
}