#include<cstdio>
#define NMAX 400005
#define max(a,b) ((a)>(b)?(a):(b))
FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");
using namespace std;
int v[NMAX],N,M;
int start,finish,val,pos,MAX;
void Update(int,int,int);
void Query(int,int,int);
int main( void )
{
fscanf(f,"%d%d",&N,&M);
int x;
for(int i(1); i <= N ; ++i )
{
fscanf(f,"%d",&x);
pos=i;
val=x;
Update(1,1,N);
}
int tip,a,b;
for(int i(1); i <= M ; ++i )
{
fscanf(f,"%d%d%d",&tip,&a,&b);
if( tip == 1 )
{
pos=a;
val=b;
Update(1,1,N);
continue;
}
if( tip == 0 )
{
MAX=0;
start=a;
finish=b;
Query(1,1,N);
fprintf(g,"%d\n",MAX);
continue;
}
}
}
void Update(int nod,int left,int right )
{
if( left == right )
{
v[nod]=val;
return ;
}
int mid=(left+right)/2;
if(pos <= mid)
Update( 2*nod,left,mid);
else
Update(2*nod+1,mid+1,right);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
void Query(int nod, int left, int right)
{
if(start<=left && right <= finish)
{
if(MAX<v[nod]) MAX=v[nod];
return ;
}
int mid=(left+right)/2;
if( start <= mid )
Query( 2*nod,left,mid);
if(mid<finish)
Query(2*nod+1,mid+1,right);
}