#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 100001;
class tree
{
private:
int arb[4*MAXN];
int n;
public:
void setN( int x ) { n = x;};
tree()
{
memset(arb,0,sizeof(arb));
}
void add_node( int node , int left , int right , int value, int position)
{
if( left == right )
{
arb[node] = value;
}
else
{
int m = (left+right)/2;
if( m < position )
{
add_node(2*node+1,m+1,right,value,position);
}
else
{
add_node(2*node,left,m,value,position);
}
arb[node] = max( arb[2*node] , arb[2*node+1] );
}
}
void getIntervalMaximum( int node , int left , int right , int a , int b , int &answer )
{
if( a <= left && right <= b )
{
answer = max(arb[node],answer);
return ;
}
int m = (left + right)/2;
if( a <= m )
{
getIntervalMaximum(2*node, left, m, a, b, answer);
}
if( m < b )
{
getIntervalMaximum(2*node+1, m+1, right, a, b, answer);
}
}
/* debug
void showTree()
{
int i ;
for( i = 1; i <= 4*n; i++ )
{
cout<<arb[i]<<' ';
}
}
*/
};
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out","w", stdout);
int n, m, value, x, a, b;
tree t;
scanf("%d %d", &n, &m);
t.setN(n);
for( int i = 1; i <= n; i++ )
{
scanf("%d", &value);
int position = i;
t.add_node(1,1,n,value,position);
}
for( int i = 1; i <= m; i++ )
{
scanf("%d %d %d",&x,&a,&b);
if( x == 1 )
{
t.add_node(1,1,n,b,a);
}
else
{
int aux = -1;
t.getIntervalMaximum(1,1,n,a,b,aux);
cout<<aux<<endl;
}
}
return 0;
}