#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long *Arb;
long _st, _dr, _x;
void init(long x) {
long k;
for (k=1; k<=x; k<<=1);
Arb = new long[2*k];
memset(Arb, 0x3f, sizeof(long)*2*k);
}
void update(long r, long st, long dr) {
if ( _st<=st && dr<=_dr ) {
Arb[r] = _x; return;
}
long mij = (st+dr)/2;
if ( _st<=mij )
update(2*r+1, st, mij);
if ( mij<_dr )
update(2*r+2, mij+1, dr);
Arb[r] = min(Arb[2*r+1], Arb[2*r+2]);
}
long query(long r, long st, long dr) {
if ( st==dr ) return Arb[r];
if ( _st<=st && dr<=_dr )
return Arb[r];
long mij=(st+dr)/2, m = 0x3f3f3f3f;
if ( _st<=mij )
m = min(m, query(2*r+1, st, mij));
if ( mij<_dr )
m = min(m, query(2*r+2, mij+1, dr));
return m;
}
int main() {
long n,m,i;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%ld %ld", &n, &m);
init(n);
for (i=1; i<=n; ++i) {
_st = _dr = i;
long x;
scanf("%ld", &x); _x = x;
update(0, 1, n);
}
scanf("\n");
while ( m-- ) {
long x,y; char c;
scanf("%ld %ld\n", &x, &y);
c = '0';
switch ( c ) {
case '0':
_st = x, _dr = y;
printf("%ld\n", query(0,1,n));
break;
case '1':
_st = x; _dr = x; _x = y;
update(0,1,n);
break;
}
}
return 0;
}