#include <iostream>
#include <fstream>
#define NMAX 1000005*2
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int ar[NMAX]; //nod unde ma aflu
//poz pozitie vector
int n,m;
int Query(int nod,int a,int b,int st,int dr)
{
int apel1=0,apel2=0;
if(st>=a && dr<=b)
{
return ar[nod];
}
else
{
int mij = (st+dr) >>1;
if(a <= mij)
{
apel1 = Query(nod<<1,a,b,st,mij);
}
if(b > mij)
{
apel2 = Query((nod<<1)|1,a,b,mij+1,dr);
}
return max(apel1,apel2);
}
}
void Update(int nod,int poz, int val,int st,int dr)
{
if(st == dr)
{
ar[nod] = val;
}
else
{
int mij = (st+dr)>>1;
if(poz<=mij)
{
Update(nod<<1,poz,val,st,mij);
}
else
{
Update((nod<<1)|1,poz,val,mij+1,dr);
}
ar[nod] = max(ar[nod<<1],ar[(nod<<1)|1]);
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
fin>>x;
Update(1,i,x,1,n);
}
for(int i=1;i<=m;i++)
{
int ch,a,b;
fin>>ch>>a>>b;
if(ch==0)
{
fout<<Query(1,a,b,1,n)<<'\n';
}
else
{
Update(1,a,b,1,n);
}
}
return 0;
}