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