#include "bits/stdc++.h" using namespace std; using ll = long long; const double pi = acos(-1); #define FOR(i,a,b) for (ll i=(a),__last_##i=(b);i<__last_##i;i++) #define RFOR(i,a,b) for (ll i=(b)-1,__last_##i=(a);i>=__last_##i;i--) #define REP(i,n) FOR(i,0,n) #define RREP(i,n) RFOR(i,0,n) #define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME #define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__) #define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__) template ostream& operator<<(ostream& os, const vector& v) { REP(i, v.size()) { if (i)os << " "; os << v[i]; }return os; } template ostream& operator<<(ostream& os, const vector>& v) { REP(i, v.size()) { if (i)os << endl; os << v[i]; }return os; } const ll INF = LLONG_MAX; ll MOD = 1000000007; ll _MOD = 1000000009; double EPS = 1e-10; #define int long long inline void my_io() { std::ios::sync_with_stdio(false); std::cin.tie(0); cout << fixed << setprecision(16); //cout << setprecision(10) << scientific << ans << endl; } template struct SegmentTree { typedef function F; typedef function G; int n; F f; G g; T d1; E d0; vector dat; vector mid; SegmentTree() {}; SegmentTree(int n_, F f, G g, T d1, vector v = vector()) : f(f), g(g), d1(d1) { init(n_); if (n_ == (int)v.size()) build(n_, v); } void init(int n_) { n = 1; while (n < n_) n *= 2; dat.clear(); dat.resize(2 * n - 1, d1); mid.clear(); mid.resize(2 * n - 1, d1); for (int i = 0; i < n; i++) { mid[n + i - 1] = i; } } void build(int n_, vector v) { for (int i = 0; i < n_; i++) dat[i + n - 1] = v[i]; for (int i = n - 2; i >= 0; i--) dat[i] = f(dat[i * 2 + 1], dat[i * 2 + 2]); } void update(int k, E a) { k += n - 1; dat[k] = g(dat[k], a); while (k > 0) { k = (k - 1) / 2; if (dat[k * 2 + 1] <= dat[k * 2 + 2]) { mid[k] = mid[k * 2 + 1]; } else { mid[k] = mid[k * 2 + 2]; } dat[k] = f(dat[k * 2 + 1], dat[k * 2 + 2]); } //cout << dat << endl; //cout << mid << endl; } inline T query(int a, int b) { T vl = d1, vr = d1; for (int l = a + n, r = b + n; l>= 1, r >>= 1) { if (l & 1) vl = f(vl, dat[(l++) - 1]); if (r & 1) vr = f(dat[(--r) - 1], vr); } return f(vl, vr); } inline T query2(int a, int b) { T vl = d1, vr = d1; int al = a, ar = b; for (int l = a + n, r = b + n; l < r; l >>= 1, r >>= 1) { if (l & 1) { //cout << l << endl; if (vl > dat[(l++) - 1]) { //cout << l << endl; vl = dat[l - 2]; al = mid[l - 2]; } } if (r & 1) { //cout << r << endl; if (vr > dat[(--r) - 1]) { //cout << r << endl; vr = dat[r - 1]; ar = mid[r - 1]; } } //cout << vl << " " << vr << endl; } if (vl <= vr) { return ++al; } else { return ++ar; } } }; signed main() { cin.tie(0); ios::sync_with_stdio(0); int n, q; cin >> n >> q; SegmentTree rmq(n, [](int a, int b) {return min(a, b); }, [](int a, int b) {return b; }, INT_MAX); for (int i = 0; i < n; i++) { int a; cin >> a; rmq.update(i, a); } for (int i = 0; i> c >> x >> y; if (c - 1) { cout << rmq.query2(x - 1, y) << endl; } else { int a = rmq.query(x - 1, x); int b = rmq.query(y - 1, y); rmq.update(x - 1, b); rmq.update(y - 1, a); rmq.update(x - 1, b); } } return 0; }