#include #define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME #define pr(...) cerr<< GET_MACRO(__VA_ARGS__,pr8,pr7,pr6,pr5,pr4,pr3,pr2,pr1)(__VA_ARGS__) <; template T Max(T &a,T b){return a=max(a,b);} template T Min(T &a,T b){return a=min(a,b);} template ostream& operator<<(ostream& o,pair p){return o<<"("< ostream& operator<<(ostream& o,tuple t){ return o<<"("<(t)<<","<(t)<<","<(t)<<")";} template istream& operator>>(istream& i,pair &p){return i>>p.first>>p.second;} template ostream& operator<<(ostream& o,vector a){Int i=0;for(T t:a)o<<(i++?" ":"")< istream& operator>>(istream& i,vector &a){for(T &t:a)i>>t;return i;} //INSERT ABOVE HERE template class Array{ public: struct Node{ T val; T mn; int priority; int size; Node *parent, *left, *right; void refresh(){ size = 1; mn = val; if(left != nullptr) { left->parent = this; size += left->size; mn = min(mn, left->mn); } if(right != nullptr) { right->parent = this; size += right->size; mn = min(mn, right->mn); } } Node():val(T()), priority(-1), parent(nullptr), left(nullptr), right(nullptr){refresh();}; Node(const T &val,int priority,Node *parent): val(val), priority(priority), parent(parent), left(nullptr), right(nullptr){refresh();}; Node(const T &val,int priority, Node *parent,Node *left,Node *right): val(val), priority(priority), parent(parent), left(left), right(right){refresh();}; }; mt19937 mt; //[0, 2^32]までのpriorityを決める乱数生成機 Node *root; T INF; Array(T INF):mt((unsigned int) time(NULL)), root(nullptr), INF(INF){} int size(){return size(root);} int size(Node *t){return t == nullptr? 0:t->size;} int empty(){return size(root) == 0;} Node* rightRotate(Node *y){ Node *x = y->left; y->left = x->right; x->right = y; x->parent = y->parent; y->parent = x; y->refresh(), x->refresh(); return x; } Node* leftRotate(Node *x){ Node *y = x->right; x->right = y->left; y->left = x; y->parent = x->parent; x->parent = y; x->refresh(), y->refresh(); return y; } Node* insert(Node *t,int k, T val,int priority, Node *parent = nullptr){ if(t == nullptr) return new Node(val, priority, parent); if(size(t->left) >= k){ t->left = insert(t->left, k, val, priority, t); if( t->priority < t->left->priority ) t = rightRotate(t); } else{ t->right = insert(t->right, k - size(t->left) - 1, val, priority, t); if( t->priority < t->right->priority ) t = leftRotate(t); } t->refresh(); return t; } //k番目の位置にvalを挿入 void insert(int k, T val){ assert(0 <= k && k <= size()); int priority = mt(); //[-2^31, 2^31 - 1] root = insert(root, k, val, priority); } void push_back(T val){return insert(size(), val);} void push_front(T val){return insert(0, val);} Node* erase(Node *t,int k){ if(size(t->left) + 1 == k+1) return _erase(t, k); if(k <= size(t->left)) t->left = erase(t->left, k); else t->right = erase(t->right, k - size(t->left) - 1); t->refresh(); return t; } Node* _erase(Node *t,int k){ if(t->left == nullptr && t->right == nullptr) { delete t; return nullptr; } if(t->left == nullptr) t = leftRotate(t); else if(t->right == nullptr) t = rightRotate(t); else { if( t->left->priority > t->right->priority ) t = rightRotate(t); else t = leftRotate(t); } t->refresh(); return erase(t, k); } void erase(int k){assert(0 <= k && k < size()); root = erase(root, k);} void pop_front(){root = erase(0);} void pop_back(){root = erase(size()-1);} Node* getKthNode(Node *t, int k){ if(size(t->left)+1 == k) return t; if(size(t->left) >= k) return getKthNode(t->left, k); return getKthNode(t->right, k - size(t->left) - 1); } T& operator[](int i){ assert(i < size()); return getKthNode(root, i+1)->val; } friend ostream& operator << (ostream& os,Array &a){ for(int i=0;i> (istream& is,Array &a){ for(int i=0;i>a[i]; return is; } T argmin(Node *t, int a, int b, int l, int r){ if(t == nullptr || r <= a || b <= l) return INF; if(a <= l && r <= b) return t->mn; assert(r - l == size(t)); T lval = argmin(t->left, a, b, l, r - size(t->right) - 1); T rval = argmin(t->right, a, b, l + size(t->left) + 1, r); int k = l + size(t->left); T res = min(lval, rval); if(a <= k && k < b) res = min(res, t->val); return res; } T argmin(int l, int r){return argmin(root, l, r, 0, size());} }; signed main(){ srand((unsigned)time(NULL)); cin.tie(0); ios_base::sync_with_stdio(0); cout << fixed << setprecision(12); int N, Q; cin>>N>>Q; Array

T(P(INF, INF)); vector A(N); for(int i=0;i>A[i]; T.insert(i, P(A[i], i)); } while(Q--){ int cmd, l, r; cin>>cmd>>l>>r; l--, r--; if(cmd == 1){ T.erase(l); T.insert(l, P(A[r], l)); T.erase(r); T.insert(r, P(A[l], r)); swap(A[l], A[r]); } else{ int ans = T.argmin(l, r+1).second; cout<