#include #include #include #include #include #include #include #include #include #include #include #define Inf 100000000 using namespace std; template struct segtree { //元データx[i]はv[n+i] //v[i]の親はv[i/2],子はv[i*2]とv[i*2+1] vector v; int n; const T init_value = make_pair(Inf, 0); segtree(vector& x) { n = 1; while (true) { if (n >= x.size())break; n *= 2; } v.resize(2 * n, init_value); for (int i = 0; i < x.size(); i++) { v[n + i] = x[i]; } for (int i = n - 1; i >= 0; i--) { v[i] = func(v[i * 2], v[i * 2 + 1]); } } void update(int x, T val) { x += n; v[x] = val; while (true) { x = (x) / 2; v[x] = func(v[x * 2], v[x * 2 + 1]); if (x <= 0)break; } } //区間[l,r)におけるクエリ処理 T query(int l, int r) { T res = init_value; l += n; r += n; while (true) { if (l % 2 == 1) { res = func(v[l], res); l++; } if (r % 2 == 1) { res = func(v[r - 1], res); r--; } if (l >= r)break; l /= 2; r /= 2; } return res; } T func(T a, T b) { return min(a, b); } void show() { int n = 1; for (int i = 1; i < v.size(); i++) { for (int j = 0; j < n; j++) { if (j != 0)cout << ' '; cout << v[i + j]; } cout << endl; i += n - 1; n *= 2; } } }; int main() { int N, Q; cin >> N >> Q; vector> A(N); for (int i = 0; i < N; i++) { cin >> A[i].first; A[i].second = i+1; } segtree> seg(A); for (int i = 1; i <= Q; i++) { int T, L, R; cin >> T >> L >> R; L--; R--; if (T == 1) { int A = seg.query(L, L + 1).first; int B = seg.query(R, R + 1).first; seg.update(L, make_pair(B, L + 1)); seg.update(R, make_pair(A, R + 1)); } if (T == 2) { cout << seg.query(L, R + 1).second << endl; } } }