#define PROBLEM "https://judge.yosupo.jp/problem/ordered_set"
#include"data_structure/bst/treap.hpp"#include<iostream>
#include<vector>voidfast_io(){std::ios_base::sync_with_stdio(false);std::cin.tie(NULL);}intmain(){fast_io();intN,Q;std::cin>>N>>Q;m1une::treap<int>tr;for(inti=0;i<N;++i){inta;std::cin>>a;tr.insert(a);}for(intq=0;q<Q;++q){inttype,k;std::cin>>type>>k;if(type==0){if(!tr.contains(k)){tr.insert(k);}}elseif(type==1){if(tr.contains(k)){tr.erase(k);}}elseif(type==2){// Find k-th smallest (0-indexed)if(tr.size()<k){std::cout<<-1<<"\n";}else{std::cout<<tr.find_by_order(k-1)<<"\n";}}elseif(type==3){// Find number of elements <= k// This is the same as the rank of k+1std::cout<<tr.order_of_key(k+1)<<"\n";}elseif(type==4){// Find largest element <= k (predecessor)intorder=tr.order_of_key(k+1);if(order==0){std::cout<<-1<<"\n";}else{std::cout<<tr.find_by_order(order-1)<<"\n";}}elseif(type==5){// Find smallest element >= k (successor)autores=tr.lower_bound(k);if(res){std::cout<<*res<<"\n";}else{std::cout<<-1<<"\n";}}}return0;}
#line 1 "verify/unit_test/treap.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/ordered_set"
#line 1 "data_structure/bst/treap.hpp"
#include<algorithm>
#include<ctime>
#include<iostream>
#include<random>namespacem1une{template<typenameT>structtreap{private:structnode{T_key;int_priority;node*_l,*_r;int_count;node(Tkey):_key(key),_priority(rand()),_l(nullptr),_r(nullptr),_count(1){}};node*_root;intcount(node*t){returnt?t->_count:0;}voidupdate_count(node*t){if(t){t->_count=1+count(t->_l)+count(t->_r);}}voidsplit(node*t,Tkey,node*&l,node*&r){if(!t){l=r=nullptr;return;}if(key<t->_key){split(t->_l,key,l,t->_l);r=t;}else{split(t->_r,key,t->_r,r);l=t;}update_count(t);}node*merge(node*l,node*r){if(!l||!r){returnl?l:r;}if(l->_priority>r->_priority){l->_r=merge(l->_r,r);update_count(l);returnl;}else{r->_l=merge(l,r->_l);update_count(r);returnr;}}voidinsert_impl(node*&t,node*item){if(!t){t=item;return;}if(item->_priority>t->_priority){split(t,item->_key,item->_l,item->_r);t=item;}else{insert_impl(item->_key<t->_key?t->_l:t->_r,item);}update_count(t);}voiderase_impl(node*&t,Tkey){if(!t){return;}if(t->_key==key){node*temp=t;t=merge(t->_l,t->_r);deletetemp;}else{erase_impl(key<t->_key?t->_l:t->_r,key);}update_count(t);}boolcontains_impl(node*t,Tkey){if(!t)returnfalse;if(t->_key==key)returntrue;if(key<t->_key){returncontains_impl(t->_l,key);}else{returncontains_impl(t->_r,key);}}Tfind_by_order_impl(node*t,intk){if(!t)returnT();// Should not happen with valid kintleft_count=count(t->_l);if(k<left_count)returnfind_by_order_impl(t->_l,k);if(k==left_count)returnt->_key;returnfind_by_order_impl(t->_r,k-left_count-1);}intorder_of_key_impl(node*t,Tkey){if(!t)return0;if(key<=t->_key)returnorder_of_key_impl(t->_l,key);returncount(t->_l)+1+order_of_key_impl(t->_r,key);}T*lower_bound_impl(node*t,Tkey){if(!t)returnnullptr;if(key<=t->_key){T*res=lower_bound_impl(t->_l,key);returnres?res:&t->_key;}returnlower_bound_impl(t->_r,key);}T*upper_bound_impl(node*t,Tkey){if(!t)returnnullptr;if(key<t->_key){T*res=upper_bound_impl(t->_l,key);returnres?res:&t->_key;}returnupper_bound_impl(t->_r,key);}public:treap():_root(nullptr){srand(time(NULL));}voidinsert(Tkey){insert_impl(_root,newnode(key));}voiderase(Tkey){erase_impl(_root,key);}boolcontains(Tkey){returncontains_impl(_root,key);}Tfind_by_order(intk){returnfind_by_order_impl(_root,k);}intorder_of_key(Tkey){returnorder_of_key_impl(_root,key);}T*lower_bound(Tkey){returnlower_bound_impl(_root,key);}T*upper_bound(Tkey){returnupper_bound_impl(_root,key);}intsize(){returncount(_root);}};}// namespace m1une#line 4 "verify/unit_test/treap.test.cpp"
#line 6 "verify/unit_test/treap.test.cpp"
#include<vector>voidfast_io(){std::ios_base::sync_with_stdio(false);std::cin.tie(NULL);}intmain(){fast_io();intN,Q;std::cin>>N>>Q;m1une::treap<int>tr;for(inti=0;i<N;++i){inta;std::cin>>a;tr.insert(a);}for(intq=0;q<Q;++q){inttype,k;std::cin>>type>>k;if(type==0){if(!tr.contains(k)){tr.insert(k);}}elseif(type==1){if(tr.contains(k)){tr.erase(k);}}elseif(type==2){// Find k-th smallest (0-indexed)if(tr.size()<k){std::cout<<-1<<"\n";}else{std::cout<<tr.find_by_order(k-1)<<"\n";}}elseif(type==3){// Find number of elements <= k// This is the same as the rank of k+1std::cout<<tr.order_of_key(k+1)<<"\n";}elseif(type==4){// Find largest element <= k (predecessor)intorder=tr.order_of_key(k+1);if(order==0){std::cout<<-1<<"\n";}else{std::cout<<tr.find_by_order(order-1)<<"\n";}}elseif(type==5){// Find smallest element >= k (successor)autores=tr.lower_bound(k);if(res){std::cout<<*res<<"\n";}else{std::cout<<-1<<"\n";}}}return0;}