#include<fstream>
#define maxn 100005
using namespace std;
int n, m;
int a[maxn], v[3*maxn];
void build(int nod, int l, int u) {
if (l == u)
v[nod] = a[l];
else {
int m = (l+u)/2;
build(2*nod, l, m);
build(2*nod+1, m+1, u);
if (v[2*nod] > v[2*nod+1])
v[nod] = v[2*nod];
else
v[nod] = v[2*nod+1];
}
}
void act(int nod, int st, int dr, int a, int b) {
if (st == dr && dr == a)
v[nod] = b;
else {
int m = (st+dr)/2;
if (a <= m)
act(2*nod, st, m, a, b);
else
act(2*nod+1, m+1, dr, a, b);
if (v[2*nod+1] < v[2*nod])
v[nod] = v[2*nod];
else
v[nod] = v[2*nod+1];
}
}
int query(int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b)
return v[nod];
int m = (st+dr)/2;
int x = -1;
int y = -1;
if (a <= m)
x = query(2*nod, st, m, a, b);
if (m+1 <= b)
y = query(2*nod+1, m+1, dr, a, b);
if (x > y)
return x;
return y;
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> m;
int i, k, x, y, aa, b, t;
for (i = 1; i <= n; i++)
f >> a[i];
build(1, 1, n);
for (i = 1; i <= m; i++) {
f >> t >> aa >> b;
if (t == 0)
g << query(1, 1, n, aa, b) << '\n';
else
act(1, 1, n, aa, b);
}
}