#include <stdio.h>
#include <fstream>
#include <assert.h>
using namespace std;
#define fr(i,a,b) for(int i=a;i<=b;++i)
#define dim 100001
int n,m;
int MaxArb[4*dim+66];
int start, finish, Val, Pos, maxim;
inline int Maxim(int a,int b) {
return a>b?a:b;
}
void Update(int,int,int);
void Query(int,int,int);
int main()
{
int x,a,b;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
fr(i,1,n)
{
scanf("%d",&x);
Pos=i,Val=x;
Update(1,1,n);
}
fr(i,1,m)
{
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
{
Pos=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(Pos<=div) Update(2*nod,left,div);
else Update(2*nod+1,div+1,right);
MaxArb[nod]=Maxim(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);
}