#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M;
int maxim;
class Arbint
{
public:
void Update(int nod, int left, int right,int pos,int val)
{
if ( left == right )
{
MaxArb[nod] = val;
return;
}
int mij = (left+right)/2;
if ( pos <= mij) Update(2*nod ,left ,mij ,pos,val);
else Update(2*nod+1,mij+1,right,pos,val);
MaxArb[nod] = max( MaxArb[2*nod], MaxArb[2*nod+1] );
}
void Query(int nod, int left, int right,int start,int finish)
{
if ( start <= left && right <= finish )
{
if ( maxim < MaxArb[nod] ) maxim = MaxArb[nod];
return;
}
int mij = (left+right)/2;
if ( start <= mij ) Query(2*nod ,left ,mij ,start,finish);
if ( mij < finish ) Query(2*nod+1,mij+1,right,start,finish);
}
private:
int MaxArb[500000];
};
int main()
{
Arbint myArb;
f>>N>>M;
for(int i=1;i<=N;i++)
{
int x;
f>>x;
myArb.Update(1,1,N,i,x);
}
for(int i=1;i<=N;i++)
{
int t,x,y;
f>>t>>x>>y;
if(t==0)
{
maxim=-1;
myArb.Query(1,1,N,x,y);
cout<<maxim<<'\n';
}
else myArb.Update(1,1,N,x,y);
}
}