#include using namespace std; using i32 = int; using i64 = long long; #define int i64 template struct Segtree { vector t; int n; Segtree(int N) : t(2 * N, e()), n(N) {} void set(int i, S value) { t[i += n] = value; for (i >>= 1; i; i >>= 1) t[i] = op(t[i << 1], t[i << 1 | 1]); } // 630e57 S query(int l, int r) { S al = e(), ar = e(); for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) al = op(al, t[l++]); if (r & 1) ar = op(t[--r], ar); } return op(al, ar); } // 9ee903 }; pair mmin(pair first, pair second) { return min(first, second); } pair neu() { return {1e18, 1e18}; } using MinSegtree = Segtree, mmin, neu>; signed main() { int n, q; cin >> n >> q; MinSegtree st(n + 1); vector> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i].first; a[i].second = i; st.set(i, a[i]); } auto one = [&](int left, int right) { pair left_val = st.query(left, left + 1); pair right_val = st.query(right, right + 1); swap(left_val.first, right_val.first); st.set(left_val.second, left_val); st.set(right_val.second, right_val); }; auto two = [&](int left, int right) { pair res = st.query(left, right + 1); cout << res.second << endl; }; while (q--) { int opt; int l, r; cin >> opt; cin >> l >> r; if (opt == 1) { one(l, r); } else { two(l, r); } } return 0; }