#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const long long INF = 1LL << 60; const long long MOD = 1000000007LL; const long long MAX = 500000LL; using namespace std; typedef unsigned long long ull; typedef long long ll; struct SegmentTree { private: ll n; vector node; public: SegmentTree(vector v) { ll sz = v.size(); n = 1; while (sz > n) n *= 2; node.resize(2 * n - 1, INF); for (ll i = 0; i < sz; i++) { node[i + n - 1] = v[i]; } for (ll i = n - 2; i >= 0; i--) { node[i] = min(node[i * 2 + 1], node[i * 2 + 2]); } } void update(ll x, ll val) { x += n - 1; node[x] = val; while (x > 0) { x = (x - 1) / 2; node[x] = min(node[x * 2 + 1], node[x * 2 + 2]); } } ll getmin(ll a, ll b, ll k = 0, ll l = 0, ll r = -1) { if (r < 0) r = n; if (r <= a || b <= l) return INF; if (a <= l && r <= b) return node[k]; ll vl = getmin(a, b, 2 * k + 1, l, (l + r) / 2); ll vr = getmin(a, b, 2 * k + 2, (l + r) / 2, r); return min(vl, vr); } }; int main() { ll N, Q; cin >> N >> Q; vector a(N); map mp; for (ll i = 0; i < N; i++) { cin >> a[i]; mp[a[i]] = i; } SegmentTree seg(a); for (ll i = 0; i < Q; i++) { ll x, l, r; cin >> x >> l >> r; l--; r--; if (x == 1) { ll a = seg.getmin(l, l + 1); ll b = seg.getmin(r, r + 1); ll temp = mp[a]; mp[a] = mp[b]; mp[b] = temp; seg.update(l, b); seg.update(r, a); } else { cout << mp[seg.getmin(l, r + 1)] + 1 << '\n'; } } return 0; }