/
H2.cpp
96 lines (82 loc) · 1.92 KB
/
H2.cpp
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
#include <cassert>
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::make_pair;
bool random(double p) {
return (double)rand() / RAND_MAX < p;
}
struct Node;
typedef std::pair <Node*, Node*> Pair;
struct Node {
int value, size;
Node *left, *right;
Node(int);
Pair split(int);
Node* update() {
size = left->size + 1 + right->size;
return this;
}
void print();
};
Node *null;
Node::Node(int value) : value(value), size(1), left(null), right(null) {}
void Node::print() {
if (this != null) {
left->print();
printf("%d ", value);
right->print();
}
}
Node* merge(Node *p, Node *q) {
if (p == null) {
return q;
}
if (q == null) {
return p;
}
if (random((double)p->size / (p->size + q->size))) {
p->right = merge(p->right, q);
return p->update();
}
q->left = merge(p, q->left);
return q->update();
}
Pair Node::split(int need) {
if (this == null) {
return make_pair(null, null);
}
if (left->size >= need) {
Pair ret = left->split(need);
left = null;
this->update();
return make_pair(ret.first, merge(ret.second, this));
}
Pair ret = right->split(need - (left->size + 1));
right = null;
this->update();
return make_pair(merge(this, ret.first), ret.second);
}
int main() {
null = new Node(-1);
null->size = 0;
null->left = null->right = null;
Node *root = null;
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++ i) {
root = merge(root, new Node(i));
}
while (m --) {
int a, b;
scanf("%d%d", &a, &b);
if (a > 1) {
Pair latter = root->split(b);
Pair former = latter.first->split(a - 1);
root = merge(former.second, merge(former.first, latter.second));
}
}
root->print();
puts("");
return 0;
}