1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| #include <iostream> #include <algorithm> #include <cstdio> #include <ctime> #include <random> #define int long long using namespace std;
const int N = 1e5 + 8;
struct node{ int l,r; int val, key; int Size; #define l(u) fhq[u].l #define r(u) fhq[u].r #define Size(u) fhq[u].Size #define v(u) fhq[u].val #define key(u) fhq[u].key }fhq[N];
int cnt,root;
mt19937 rnd(23311113);
int newnode(int val) { fhq[++cnt].val = val; fhq[cnt].key = rnd(); fhq[cnt].Size = 1; return cnt; }
void update(int u) { Size(u) = Size(l(u)) + Size(r(u)) + 1; }
void split(int u,int val, int &x, int &y) { if (!u) x = y = 0; else { if (v(u) <= val) { x = u; split(r(u),val,r(u),y); }else { y = u; split(l(u), val, x , l(u)); } update(u); } }
int merge(int x,int y) { if (!x || !y) return x + y; if (key(x) > key(y)) { r(x) = merge(r(x),y); update(x); return x; } else { l(y) = merge(x,l(y)); update(y); return y; } }
int x,y,z;
void Insert(int val) { split(root,val,x,y); root = merge(merge(x,newnode(val)),y); } void del(int val) { split(root,val,x,z); split(x,val-1,x,y); y = merge(l(y), r(y)); root = merge(merge(x,y),z); } void getrank(int val) { split(root,val-1,x,y); printf("%lld\n",Size(x) + 1); root = merge(x,y); } void getnum(int rank) { int u = root; while (u) { if (Size(l(u)) + 1 == rank) break; else if (Size(l(u)) >= rank) u = l(u); else { rank -= Size(l(u)) + 1; u = r(u); } } printf("%lld\n",v(u)); } void pre(int val) { split(root,val-1,x,y); int u = x; while (r(u)) u = r(u); printf("%lld\n",v(u)); root = merge(x,y); } void nxt(int val) { split(root,val,x,y); int u = y; while (l(u)) u = l(u); printf("%lld\n",v(u)); root = merge(x,y); }
signed main () { int n; cin >> n; for (int i =1; i <= n; i ++ ) { int op,x; scanf("%lld%lld",&op,&x); if(op == 1) Insert(x); else if (op == 2) del(x); else if (op == 3) getrank(x); else if (op == 4) getnum(x); else if (op == 5) pre(x); else nxt(x); } }
|