#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int Maxarb[1<<18] , N , M , ans;
static inline int MAX(int a,int b)
{
return a > b ? a : b;
}
void query(int nod,int left,int right,const int &start,const int &finish)
{
if(start<=left && right<=finish)
ans = max(ans,Maxarb[nod]);
else
{
int mid = (left + right)>>1;
if(start <= mid) query(nod<<1,left,mid,start,finish);
if(finish > mid) query((nod<<1) + 1,mid + 1,right,start,finish);
}
}
void update(int nod,int left,int right,const int &pos,const int &val)
{
if(left==right)
Maxarb[nod] = val;
else
{
int mid = (left + right)>>1;
pos > mid ? update((nod<<1) + 1,mid+1,right,pos,val) : update(nod<<1,left,mid,pos,val);
Maxarb[nod] = MAX(Maxarb[nod<<1],Maxarb[(nod<<1) + 1]);
}
}
int main()
{
int X , A , B;
fin>>N>>M;
for(int i=1;i<=N;++i)
fin>>X , update(1,1,N,i,X);
for(;M;M--)
{
fin>>X>>A>>B;
if(X==0)
{
ans = - 1;
query(1,1,N,A,B);
fout<< ans << '\n';
}
else
update(1,1,N,A,B);
}
return 0;
}