#include<cstdio>
#include<algorithm>
using namespace std;
#define NMax 100001
int MaxArb[2*NMax];
int Q, N, pos, val, maxim, start, finish;
void Update(int,int,int);
void Query(int,int,int);
int main ()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int x,A,B;
scanf("%d %d\n",&N,&Q);
for(int i=1;i<=N;i++)
{
scanf("%d ",&x);
pos=i; val=x;
Update(1,1,N);
}
for(int i=1;i<=Q;i++)
{
scanf("%d %d %d\n",&x,&A,&B);
if(x==0)
{
maxim=-1;
start=A; finish=B;
Query(1,1,N);
printf("%d\n",maxim);
}
else
{
pos=A; val=B;
Update(1,1,N);
}
}
}
void Update(int nod, int left, int right)
{
if(left==right)
{
MaxArb[nod]=val;
return;
}
int mij = (left + right)/2;
if(pos <= mij) Update(nod*2, left, mij);
else Update(nod*2+1, mij+1, right);
MaxArb[nod]= max( MaxArb[nod*2], MaxArb[nod*2+1]);
}
void Query(int nod, int left, int right)
{
if( start<=left && right<=finish)
{
if(MaxArb[nod] > maxim) maxim=MaxArb[nod];
return;
}
int mij= (left + right)/2;
if( start<=mij ) Query(nod*2, left, mij);
if( mij <finish) Query(nod*2+1, mij+1, right);
}