#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int v[500000];
int n;
int max ( int, int );
void actualizare ( int , int , int , int , int , int);
int interogare ( int , int ,int , int ,int );
int main()
{
int i,y,m;
int j,k,l;
fin>>n>>m;
if (n)
{
for (i=1;i<=n;i++)
{
fin>>y;
actualizare(1,1,n,i,i,y);
}
for ( i=0;i<m;i++)
{
fin>>j>>k>>l;
if ( j )
{
actualizare(1,1,n,k,k,l);
}
else
{
fout<<interogare(1,1,n,k,l)<<"\n";
}
}
//for ( i=1;i<=4*n-1;i++)
// fout<<v[i]<<" ";
//fout<<" \n";
//fout<<interogare(1,1,10,3,4);
}
fin.close();
fout.close();
return 0;
}
void actualizare (int poz,int stg,int dr,int a,int b,int x)
{
//fout<<"functia este apelata pentru "<<poz<<" "<<stg<<" "<<dr<<" "<<a<<" "<<b<<" "<<x<<"\n";
int mid;
if (( a<= stg) && (dr<=b))
{
//check[poz]=1;
v[poz]=x;
}
else
{
mid=(stg+dr)/2;
if ( a<=mid )
actualizare (2*poz,stg,mid,a,b,x);
if ( mid<b )
actualizare (2*poz+1,mid+1,dr,a,b,x);
v[poz]=max(v[2*poz],v[2*poz+1]);
}
}
int max ( int a , int b )
{
if ( a>b )
return a;
return b;
}
int interogare (int poz,int stg,int dr,int a,int b)
{
//fout<<"functia este apelata pentru "<<poz<<" "<<stg<<" "<<dr<<" "<<a<<" "<<b<<" "<<x<<"\n";
int mid,s=0,d=0;
if (( a<= stg) && (dr<=b))
{
return v[poz];
}
else
{
mid=(stg+dr)/2;
if ( a<=mid )
s=interogare (2*poz,stg,mid,a,b);
if ( mid<b )
d=interogare (2*poz+1,mid+1,dr,a,b);
return max(s,d);
// v[poz]=max(v[2*poz],v[2*poz+1]);
}
}