//#include <stdio.h>
#include <fstream>
//#include <assert.h>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
const int dim = 100001;
int N, M;
int MaxArb[dim<<2];
int maxim;
inline int Maxim(int a, int b) {
if ( a > b ) return a;
return b;
}
void Update(int nod, int left,int right, int poz, int val)
{
if(left == right)
{
MaxArb[nod]=val;
return;
}
int mij = ( left + right)/2;
if(poz <=mij)
Update(2*nod,left,mij,poz,val);
else
Update(2*nod+1,mij+1,right,poz,val);
MaxArb[nod]=Maxim(MaxArb[2*nod],MaxArb[2*nod+1]);
}
void Query(int nod,int left,int right,int first,int last)
{
if(first <= left && right<=last)
{
if(maxim < MaxArb[nod])
maxim = MaxArb[nod];
return;
}
int mij = (left+right)/2;
if( first <= mij)
Query(nod*2,left,mij,first,last);
if( mij < last)
Query(nod*2+1,mij+1, right, first,last);
}
int main()
{
int X, A, B;
in>>N>>M;
for ( int i = 1; i <= N; i++ )
{
in>>X;
Update(1,1,N,i,X);
}
for ( int i = 1; i <= M; i++ )
{
in>>X>>A>>B;
if ( X == 0 )
{
maxim = -1;
Query(1,1,N,A,B);
out<<maxim<<"\n";
}
else
{
Update(1,1,N,A,B);
}
}
}