// yukicoder: 875 Range Mindex Query // 2019.9.6 bal4u #include #include #include #if 1 #define gc() getchar_unlocked() #define pc(c) putchar_unlocked(c) #else #define gc() getchar() #define pc(c) putchar(c) #endif int in() { // 整数の入力 int n = 0, c = gc(); if (c == '-') { c = gc(); do n = 10*n + (c & 0xf), c = gc(); while (c >= '0'); return -n; } do n = 10*n + (c & 0xf), c = gc(); while (c >= '0'); return n; } void out(int n) { // 整数の表示 int i; char b[30]; if (!n) pc('0'); else { if (n < 0) pc('-'), n = -n; i = 0; while (n) b[i++] = n % 10 + '0', n /= 10; while (i--) pc(b[i]); } pc('\n'); } #define INF 0x7ffffff //// セグメント木 int seg[1 << 19]; int sz; void segInit(int n) { sz = 1; while (sz < n) sz <<= 1; memset(seg, INF, sizeof(seg)); } // k番目(0-index)の値を v に変更 void update(int k, int v) { int a, b; k += sz - 1; // if (seg[id][k] == v) return; seg[k] = v; while (k > 0) { k = (k - 1) >> 1; a = seg[(k << 1) + 1]; b = seg[(k << 1) + 2]; seg[k] = (a <= b)? a: b; } } // 空間 [a, b) 内の最小値 int getMin(int a, int b, int k, int l, int r) { int left, right; if (r <= a || b <= l) return INF; if (a <= l && r <= b) return seg[k]; left = getMin(a, b, (k << 1) + 1, l, (l + r) >> 1); right = getMin(a, b, (k << 1) + 2, (l + r) >> 1, r); return left <= right ? left : right; } int a[100005]; int p[100005]; int main() { int i, N, Q; int syn; N = in(), Q = in(); segInit(N+1); // セグメント木の初期化 for (i = 1; i <= N; i++) { a[i] = in(), p[a[i]] = i; update(i, a[i]); } while (Q--) { int id = in(), l = in(), r = in(); // 0-index if (id == 1) { int x = a[l]; a[l] = a[r], a[r] = x; x = p[a[r]], p[a[r]] = p[a[l]], p[a[l]] = x; update(l, a[l]), update(r, a[r]); } else out(p[getMin(l, r+1, 0, 0, sz)]); } return 0; }