#include <iostream>
#include <cstdio>
#include <algorithm>
#include <fstream>
using namespace std;
int n,vec[100000],ai[400000],x,y,sol;
int lista[100000][3];
ifstream fin("arbint.in");
ofstream fout("arbint.out");
class arb
{
public:
void creare(int st, int dr, int pai);
void cautare(int st, int dr, int pai);
void refresh(int st, int dr, int pai);
};
void arb::creare(int st, int dr, int pai)
{
if(st==dr)
{
ai[pai]=vec[st];
return;
}
int mij=(st+dr)>>1;
creare(st,mij,2*pai);
creare(mij+1,dr,2*pai+1);
ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}
void arb::cautare(int st, int dr,int pai)
{
if(st==dr || x <= st && dr <= y)
{
sol=max(ai[pai],sol);
return;
}
int mij=(st+dr)>>1;
if(x<=mij)
{
cautare(st,mij,2*pai);
}
if(y>mij)
{
cautare(mij+1,dr,2*pai+1);
}
}
void arb::refresh(int st, int dr, int pai)
{
if(st==dr && st==x)
{
ai[pai]=y;
return;
}
int mij=(st+dr)>>1;
if(x<=mij)
{
refresh(st,mij,2*pai);
}
if(x>mij)
{
refresh(mij+1,dr,2*pai+1);
}
ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}
void citire()
{
int m;
arb arbore;
fin>>n>>m;
//scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
fin>>vec[i];
//scanf("%d ",&vec[i]);
}
arbore.creare(1,n,1);
for(int i=0; i<m; i++)
{
fin>>lista[i][0]>>lista[i][1]>>lista[i][2];
//scanf("%d %d %d",&lista[i][0],&lista[i][1],&lista[i][2]);
}
fin.close();
for(int i=0; i<m; i++)
{
x=lista[i][1];
y=lista[i][2];
if(lista[i][0]==1)
{
arbore.refresh(1,n,1);
}
else
{
sol=0;
arbore.cautare(1,n,1);
//printf("%d\n",sol);
fout<<sol<<endl;
}
}
}
int main()
{
//freopen("arbint.in","r",stdin);
//freopen("arbint.out","w",stdout);
citire();
}