#include<stdio.h>
#define maxn 1<<18
#define INF 1<<30
int arb[maxn], v[maxn>>1];
int minim( const int &a, const int &b){
if( a > b ) return a;
return b;
}
void creaza(int poz, int left, int right){
if( left == right) {
arb[poz] = v[left];
return;
}
creaza(poz * 2, left, (left+right)>>1);
creaza(poz * 2+1, ((left+right)>>1) +1, right);
arb[poz] = minim( arb[poz*2], arb[poz*2+1]);
}
int get_min( int poz, int left, int right,const int &L,const int &R) {
if( left > R) return 0;
if( right < L) return 0;
if( L <= left && R >= right)
return arb[poz];
return minim( get_min( poz*2, left, (left+right)/2, L, R),
get_min( poz*2+1, (left+right)/2 + 1,right,L,R));
}
void update( int poz, int left, int right,const int &unde, const int &value) {
if( unde < left) return;
if( unde > right) return;
if( left == right) {
arb[poz ] = value; return;
}
update( poz * 2, left, (left+right)/2, unde, value);
update( poz * 2+1, (left+right)/2+1, right, unde, value);
arb[poz] = minim( arb[poz*2], arb[poz*2+1]);
}
int main() {
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int N, M;
scanf("%d %d", &N, &M);
for( int i = 1; i <= N; ++i)
scanf("%d", &v[i]);
creaza(1,1,N);
for( int i = 1; i <= M; ++i) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if( a == 0)
printf("%d\n", get_min( 1, 1, N, b, c));
else update( 1, 1, N, b, c);
}
return 0;
}