#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, a, b, op, i, elem;
int arb[1000001];
void update(int nod, int st, int dr, int poz, int elem)
{
if (st==dr)
{
arb[nod]=elem;
return;
}
int mid = (st+dr)/2;
if (mid >= poz) //subarb stang
update(nod*2, st, mid, poz, elem);
else //subarb drept
update(nod*2+1, mid+1, dr, poz, elem);
if (arb[nod*2] > arb[nod*2+1])
arb[nod] = arb[nod*2];
else
arb[nod] = arb[nod*2+1];
}
int get_maxim(int nod, int st, int dr, int lst, int ldr)
{
if (lst>dr || ldr<st)
return 0;
if (lst<=st && dr<=ldr)
return arb[nod];
int mid = (st+dr)/2;
int x = get_maxim(nod*2, st, mid, lst, ldr);
int y = get_maxim(nod*2+1, mid+1, dr, lst, ldr);
if (x>y)
return x;
else
return y;
}
int main()
{
f>>n>>m;
for (i=1; i<=n; i++)
{
f>>elem;
update(1, 1, n, i, elem);
}
for (i=1; i<=m; i++)
{
f>>op>>a>>b;
if (op==0)
g<<get_maxim(1, 1, n, a, b)<<"\n";
else
if(op==1)
update(1, 1, n, a, b);
}
return 0;
}