/*
ID:piyushp1
LANG:C
TASK:segment tree again
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int loga(int n);
int power(int n);
void maketree(int *a,int size,int low,int high,int index);
void update(int *a,int size,int low,int high,int index,int des);
int query(int *a,int size,int low,int high,int index,int A,int B);
int *b;
int main()
{
FILE *fin,*fout;
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
int i,j,k,m,n;
fscanf(fin,"%d%d",&m,&n);
b=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
fscanf(fin,"%d",&b[i]);
i=loga(n);
//printf("%d\n",i);
i++;i++;
int size=power(i);
int *a=(int*)malloc(sizeof(int)*size);
for(i=0;i<size;i++)
a[i]=-1;
maketree(a,size,0,n-1,0);
int **op=(int**)malloc(sizeof(int)*m);
int *ans=(int*)malloc(sizeof(int)*m);
k=0;
for(i=0;i<m;i++)
op[i]=(int*)malloc(sizeof(int)*3);
for(i=0;i<m;i++)
{
fscanf(fin,"%d%d%d",&op[i][0],&op[i][1],&op[i][2]);
if(op[i][0]==0)
{
op[i][1]--;op[i][2]--;
ans[k++]=b[query(a,size,0,n-1,0,op[i][1],op[i][2])];
}
if(op[i][0]==1)
{
op[i][1]--;
b[op[i][1]]=op[i][2];
update(a,size,0,n-1,0,op[i][1]);
}
}
for(i=0;i<k;i++)
fprintf(fout,"%d\n",ans[i]);
return(0);
}
// a,b are intervals to query upon
int query(int *a,int size,int low,int high,int index,int A,int B)
{
int i,j;
if(low==high)
return(a[index]);
else
{
if(A>high)
return(-1);
if(A<low)
return(-1);
if(A>(low+high)/2 && B<=high)
return(query(a,size,(low+high)/2+1,high,2*index+2,A,B));
if(A>=low && B<=(low+high)/2)
return(query(a,size,low,(low+high)/2,2*index+1,A,B));
if(A<=(low+high)/2 && B>(low+high)/2 )
{
i=query(a,size,low,(low+high)/2,2*index+1,A,(low+high)/2);
j=query(a,size,(low+high)/2+1,high,2*index+2,(low+high)/2+1,B);
if(b[i]>b[j])
return(i);
else
return(j);
}
}
}
void maketree(int *a,int size,int low,int high,int index)
{
if(high==low)
{
a[index]=low;
return;
}
else
{
maketree(a,size,low,(low+high)/2,2*index+1);
maketree(a,size,(low+high)/2+1,high,2*index+2);
if(b[a[2*index+1]]>b[a[2*index+2]])
a[index]=a[2*index+1];
else
a[index]=a[2*index+2];
}
}
void update(int *a,int size,int low,int high,int index,int des)
{
if(low==high)
return;
else
{
if(des>(low+high)/2)
update(a,size,(low+high)/2+1,high,2*index+2,des);
else
update(a,size,low,(low+high)/2,2*index+1,des);
if(b[a[2*index+1]]>b[a[2*index+2]])
a[index]=a[2*index+1];
else
a[index]=a[2*index+2];
}
}
int power(int n)
{
int i;
if(n==0)
return(1);
if(n==1)
return(2);
i=power(n/2);
if(n%2==0)
return(i*i);
else
return(i*i*2);
}
int loga(int n)
{
int i;
i=0;
while(n>1)
{
n=n/2;
i++;
}
return(i);
}