#include <stdio.h>
#define MAXN 100000
int arb[4*MAXN];
int M,N;
int max(int a, int b)
{
if( a > b )
return a;
else
return b;
}
void ChangeValue(int node, int left, int right, int position, int value)
{
// printf("Change value (node %d, left %d, right %d, position %d\n",node,left,right,position);
if( left == right ){
// printf("Setez %d la %d \n",value,node);
arb[node] = value;
return;
}
int mid = (left+right)/2;
if(position<=mid)
ChangeValue(2*node,left,mid,position,value);
else
ChangeValue(2*node+1,mid+1,right,position,value);
// printf("Max Left = %d, Max Right = %d\n",arb[2*node],arb[2*node+1]);
arb[node] = max(arb[2*node],arb[2*node+1]);
// printf("Change value (node %d, left %d, right %d, max %d\n",node,left,right, arb[node]);
}
int GetMax(int node, int left, int right, int intLeft, int intRight)
{
// printf("Get max (node %d, left %d, right %d, intLeft %d, intRight %d\n",node,left,right,intLeft,intRight);
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,intLeft,intRight);
if( intRight > mid )
val2 = GetMax(node*2+1,mid+1,right,intLeft,intRight);
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",&M,&N);
int i,op,a,b;
for(i=0;i<N;i++){
fscanf(fin,"%d",&a);
ChangeValue(1,1,N,i+1,a);
}
for(i=0;i<M;i++){
fscanf(fin,"%d %d %d",&op,&a,&b);
if( op == 0 )
fprintf(fout,"%d\n",GetMax(1,1,N,a,b));
else
ChangeValue(1,1,N,a,b);
}
fclose(fin);
fclose(fout);
return 0;
}