1 #include <iostream>
2 #include <cstdlib>
3 #include <cstring>
4 #include <queue>
5 #include <cstdio>
6 #include <algorithm>
7 #include <map>
8 #define LL long long
9
10 using namespace std;
11
12 struct Treap_node
13 {
14 Treap_node *left,*right;
15 int value,fix; //the value and the random fix value
16 }*root;
17
18 void Treap_left_rotate(Treap_node *&a)
19 {
20 Treap_node *b = a->right;
21 a->right = b->left;
22 b->left = a;
23 a = b;
24 }
25
26 void Treap_right_rotate(Treap_node *&a)
27 {
28 Treap_node *b = a->left;
29 a->left = b->right;
30 b->right = a;
31 a = b;
32 }
33
34 void Treap_insert(Treap_node*&p, int value)
35 {
36 if(!p)
37 {
38 p = new Treap_node;
39 p->value = value;
40 p->fix = rand();
41 p->left = p->right = NULL;
42 }
43 else if(value <= p->value)
44 {
45 Treap_insert(p->left,value);
46 if(p->left->fix < p->fix)
47 Treap_right_rotate(p);
48 }
49 else
50 {
51 Treap_insert(p->right,value);
52 if(p->right->fix < p->fix)
53 Treap_left_rotate(p);
54 }
55 }
56
57 void Treap_delete(Treap_node* &p,int value)
58 {
59 if(value < p->value)
60 Treap_delete(p->left,value);
61 else if(value > p->value)
62 Treap_delete(p->right,value);
63 else
64 {
65 if(!p->right || !p->left) //link nodes or have no child node
66 {
67 Treap_node *t;
68 t = p;
69 if(!p->right)
70 p = p->left;
71 else
72 p = p->right;
73 delete t;
74 }
75 else
76 {
77 if(p->left->fix < p->right->fix)
78 {
79 Treap_right_rotate(p);
80 Treap_delete(p->right,value);
81 }
82 else
83 {
84 Treap_left_rotate(p);
85 Treap_delete(p->left,value);
86 }
87 }
88 }
89 }