#include<fstream>
#define NMAX 300000
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=2*k;
fd=fs+1;
mij=(st+dr)/2;
if (p<=mij)
{
addToTree(a,st,mij,2*k,p);
}
else addToTree(a,mij+1,dr,2*k+1,p);
if (v[fs]>v[fd])
v[k]=v[fs];
else v[k]=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)/2;
if (a<=mij)
fs=searchMax(2*k,a,b,st,mij);
if (b>mij)
fd=searchMax(2*k+1,a,b,mij+1,dr);
if (fs<fd)
return fd;
return fs;
}
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;
}