#include <stdio.h>
#define MAXN 100000
int arb[4*MAXN];
int v[MAXN];
int M,N;
int position,value,intLeft,intRight;
int max(int a, int b)
{
if( a > b )
return a;
else
return b;
}
void BuildArbInt(int node, int left, int right)
{
if( left == right ){
arb[node] = v[left];
return;
}
int mid = (left+right)/2;
BuildArbInt(2*node,left,mid);
BuildArbInt(2*node+1,mid+1,right);
arb[node] = max(arb[2*node],arb[2*node+1]);
}
void ChangeValue(int node, int left, int right)
{
if( left == right ){
arb[node] = value;
return;
}
int mid = (left+right)/2;
if(position <= mid )
ChangeValue(2*node,left,mid);
else
ChangeValue(2*node+1,mid+1,right);
arb[node] = max(arb[2*node],arb[2*node+1]);
}
int GetMax(int node, int left, int right)
{
if( intLeft <= left && right<=intRight){
return arb[node];
}
int mid = (left+right)/2;
// left ( left, mid ) , right( mid + 1 , right )
int val1=0,val2=0;
if( intLeft <= mid )
val1 = GetMax(node*2,left,mid);
if( intRight > mid )
val2 = GetMax(node*2+1,mid+1,right);
return max(val1,val2);
}
int main(int argc, char* argv[])
{
FILE *fin,*fout;
fin = fopen("arbint.in","r");
fout = fopen("arbint.out","w");
fscanf(fin,"%d %d",&N,&M);
int i,op,a,b;
for(i=0;i<N;i++){
fscanf(fin,"%d",&a);
v[i+1] = a;
}
BuildArbInt(1,1,N);
for(i=0;i<M;i++){
fscanf(fin,"%d %d %d",&op,&a,&b);
if( op == 0 ){
intLeft = a;
intRight = b;
fprintf(fout,"%d\n",GetMax(1,1,N));
}
else{
position = a;
value = b;
ChangeValue(1,1,N);
}
}
fclose(fin);
fclose(fout);
return 0;
}