#include using namespace std; template class SegmentTree { private: using Type = typename M::Type; size_t sz = 1; std::vector node; public: SegmentTree(const size_t n) { while (sz < n) { sz *= 2; } node.resize(2 * sz, M::e); } SegmentTree(const std::vector &vec) { while (sz < vec.size()) { sz *= 2; } node.resize(2 * sz, M::e); for (size_t i = 0; i < vec.size(); i++) { node[i + sz] = vec[i]; } for (size_t i = sz - 1; i < sz; i--) { node[i] = M::op(node[2 * i], node[2 * i + 1]); } } void update(size_t i, const Type x) { i += sz; node[i] = M::ap(node[i], x); while (i > 0) { i /= 2; node[i] = M::op(node[2 * i], node[2 * i + 1]); } } Type query(int l, int r) { Type left = M::e, right = M::e; for (l += sz, r += sz; l < r; l /= 2, r /= 2) { if (l & 1) left = M::op(left, node[l++]); if (r & 1) right = M::op(node[--r], right); } return M::op(left, right); } }; struct Monoid { using Type = int; constexpr static Type e = 1 << 28; static Type op(const Type &a, const Type &b) { return min(a, b); } static Type ap(const Type &a, const Type &b) { return b; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vector A(N); map mp; for (int i = 0; i < N; i++) { cin >> A[i]; mp[A[i]] = i; } SegmentTree sg(A); for (int i = 0; i < Q; i++) { int q, l, r; cin >> q >> l >> r; l--, r--; if (q == 1) { mp[A[r]] = l; mp[A[l]] = r; sg.update(l, A[r]); sg.update(r, A[l]); swap(A[l], A[r]); } else { cout << mp[sg.query(l, r + 1)] + 1 << '\n'; } } return 0; }