File tree 1 file changed +45
-7
lines changed
1 file changed +45
-7
lines changed Original file line number Diff line number Diff line change 1
1
#include < bits/stdc++.h>
2
2
using namespace std ;
3
3
4
- typedef struct node {
4
+ typedef struct node {
5
5
int val,prior,size;
6
6
struct node *l,*r;
7
7
} node;
8
8
9
9
typedef node* pnode;
10
10
11
- int sz (pnode t){
11
+ int sz (pnode t) {
12
12
return t ? t->size : 0 ;
13
13
}
14
14
15
- pnode init (int val){
15
+ void upd_sz (pnode t) {
16
+ if (t) {
17
+ t->size = sz (t->l ) + 1 + sz (t->r );
18
+ }
19
+ }
20
+
21
+ void split (pnode t, pnode &l, pnode &r, int key) {
22
+ if (!t) {
23
+ l = r = NULL ;
24
+ }
25
+ else if (t->val <= key) {
26
+ split (t->r , t->r , r, key);
27
+ l = t;
28
+ }
29
+ else {
30
+ split (t->l , l, t->l , key);
31
+ r = t;
32
+ }
33
+
34
+ upd_sz (t);
35
+ }
36
+
37
+ void merge (pnode &t, pnode l, pnode r) {
38
+ if (!l || !r) {
39
+ t = l?l:r;
40
+ }
41
+ else if (l->prior > r->prior ) {
42
+ merge (l->r , l->r , r);
43
+ t = l;
44
+ }
45
+ else {
46
+ merge (r->l , l, r->l );
47
+ t = r;
48
+ }
49
+
50
+ upd_sz (t);
51
+ }
52
+
53
+ pnode init (int val) {
16
54
pnode ret = (pnode)malloc (sizeof (node));
17
- ret->val = val;
18
- ret->size = 1 ;
19
- ret->prior = rand ();
20
- ret->l = ret->r = NULL ;
55
+ ret->val = val;
56
+ ret->size = 1 ;
57
+ ret->prior = rand ();
58
+ ret->l = ret->r = NULL ;
21
59
return ret;
22
60
}
You can’t perform that action at this time.
0 commit comments