#include <iostream>
#include <fstream>
using namespace std;
#define iFileName "arbint.in"
#define oFileName "arbint.out"
#define dim 100001
int arb[4*dim + 66]; // nem tudom miert pont 4*dim+66
int maxim,N,M;
inline int Maxim(int a, int b) {
if ( a > b ) return a;
return b;
}
void Update(int nodId, int start, int finish, int pozi, int valo) ;
void Querry(int nodId, int start, int finish, int from, int to ) ;
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%i %i",&N,&M);
int X,A,B;
for (int i = 1; i<=N; i++) {
scanf("%i",&X);
Update(1,1,N,i,X);
}
for ( int i = 0; i < M; i++) {
scanf("%i %i %i",&X,&A,&B);
if (X == 0) {
maxim = -1;
Querry(1,1,N,A,B);
printf("%i \n",maxim);
}
else {
Update(1,1,N,A,B);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
void Update(int nodId, int start, int finish, int pozi, int valo)
{
if (start == finish) {
arb[nodId] = valo ;
return ;
}
int mid = ((start + finish) >> 1);
if (pozi <= mid ){
Update((nodId<<1),start,mid,pozi,valo) ;
}
else {
Update((nodId<<1) + 1, mid+1,finish,pozi,valo) ;
}
arb[nodId] = Maxim(arb[nodId<<1],arb[(nodId<<1)+1]);
}
void Querry(int nodId, int start, int finish, int from, int to)
{
if (from <= start && finish <= to ) {
if (maxim < arb[nodId] ) maxim = arb[nodId] ;
return ;
}
int mid = ((start + finish)>>1) ;
if ( from <= mid ) Querry((nodId<<1), start, mid, from, to);
if ( mid < to) Querry((nodId<<1)+1, mid+1, finish, from, to);
}