#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[NMAX], arb[3*NMAX], n, m, i, x, cif, y;
void update(int st, int dr, int poz, int nod)
{
if(st == dr)
{
arb[nod] = v[poz];
return;
}
int mid = ((st+dr)>>1);
if(mid >= poz)
update(st, mid, poz, (nod<<1));
if(mid < poz)
update(mid+1, dr, poz, (nod<<1)+1);
arb[nod] = max(arb[nod<<1], arb[(nod<<1)+1]);
}
int querry(int st, int dr, int st1, int dr1, int nod)
{
if(st == st1 && dr == dr1)
return arb[nod];
int mid = (st+dr)/2;
if(mid >= dr1)
return querry(st, mid, st1, dr1, (nod<<1));
if(mid < st1)
return querry(mid+1, dr, st1, dr1, (nod<<1)+1);
return max(querry(st, mid, st1, mid, (nod<<1)), querry(mid+1, dr, mid+1, dr1, (nod<<1)+1));
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>v[i];
update(1,n,i,1);
}
for(i=1;i<=m;i++)
{
f>>cif>>x>>y;
if(cif)
{
v[x] = y;
update(1,n,x,1);
}
else
g<<querry(1,n,x,y,1)<<"\n";
}
}