Skip to content

Commit 98fe4c7

Browse files
authored
Implement merge and split
1 parent c36f96f commit 98fe4c7

File tree

1 file changed

+45
-7
lines changed

1 file changed

+45
-7
lines changed

Data Structures/Treap/treap.cpp

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,60 @@
11
#include <bits/stdc++.h>
22
using namespace std;
33

4-
typedef struct node{
4+
typedef struct node {
55
int val,prior,size;
66
struct node *l,*r;
77
} node;
88

99
typedef node* pnode;
1010

11-
int sz(pnode t){
11+
int sz (pnode t) {
1212
return t ? t->size : 0;
1313
}
1414

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) {
1654
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;
2159
return ret;
2260
}

0 commit comments

Comments
 (0)