#include<fstream>
#define NMAX (1<<18)
#define inf 1000000001
using namespace std;
int v[NMAX];
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m;
void scan()
{
in>>n>>m;
}
inline int max(int a,int b)
{
if (a>b)
return a;
return b;
}
void addToTree(int a,int st,int dr,int k,int p)
{
if (st==dr)
{
v[k]=a;
return;
}
int mij;
int fs,fd;
fs=(k<<1);
fd=fs+1;
mij=((st+dr)>>1);
if (p<=mij)
{
addToTree(a,st,mij,(k<<1),p);
}
else addToTree(a,mij+1,dr,(k<<1)+1,p);
v[k]=max(v[fs],v[fd]);
}
int searchMax(int k,int a,int b,int st,int dr)
{
int fs=0,fd=0,mij;
if (a<=st && dr<=b)
return v[k];
mij=((st+dr)>>1);
if (a<=mij)
fs=searchMax(k<<1,a,b,st,mij);
if (b>mij)
fd=searchMax((k<<1)+1,a,b,mij+1,dr);
return max(fs,fd);
}
void solve()
{
int a,b,c;
for (int i=1;i<=m;i++)
{
in>>c>>a>>b;
if (!c)
{
out<<searchMax(1,a,b,1,n)<<"\n";
}
else addToTree(b,1,n,1,a);
}
}
void add()
{
int a;
for (int i=1;i<=n;i++)
{
in>>a;
addToTree(a,1,n,1,i);
}
}
int main()
{
scan();
add();
solve();
return 0;
}