1
+ /* *
2
+ * @file 105.cpp
3
+ * @author Macesuted ([email protected] )
4
+ * @date 2022-05-01
5
+ *
6
+ * @copyright Copyright (c) 2022
7
+ *
8
+ */
9
+
10
+ #include < bits/stdc++.h>
11
+ using namespace std ;
12
+
13
+ bool mem1;
14
+
15
+ class FhqTreap {
16
+ private:
17
+ struct Node {
18
+ Node *l, *r;
19
+ int val, rnk, siz;
20
+ bool rev;
21
+ Node (int val_) { l = r = NULL , val = val_, rnk = rand (), siz = 1 , rev = false ; }
22
+ };
23
+
24
+ Node* root;
25
+
26
+ int getSiz (Node* p) { return p ? p->siz : 0 ; }
27
+ void rev (Node* p) { return p && (swap (p->l , p->r ), p->rev ^= true ), void (); }
28
+ void pushDown (Node* p) { return p && p->rev && (rev (p->l ), rev (p->r ), p->rev = false ), void (); }
29
+ void pushUp (Node* p) { return p->siz = 1 + getSiz (p->l ) + getSiz (p->r ), void (); }
30
+ void split (Node* p, Node*& t1, Node*& t2, int s) {
31
+ if (!p) return t1 = t2 = NULL , void ();
32
+ pushDown (p);
33
+ if (1 + getSiz (p->l ) <= s)
34
+ t1 = p, split (p->r , t1->r , t2, s - 1 - getSiz (p->l ));
35
+ else
36
+ t2 = p, split (p->l , t1, t2->l , s);
37
+ return pushUp (p);
38
+ }
39
+ void merge (Node*& p, Node* t1, Node* t2) {
40
+ if (!t1) return p = t2, void ();
41
+ if (!t2) return p = t1, void ();
42
+ if (t1->rnk < t2->rnk )
43
+ pushDown (p = t1), merge (p->r , t1->r , t2);
44
+ else
45
+ pushDown (p = t2), merge (p->l , t1, t2->l );
46
+ return pushUp (p);
47
+ }
48
+ void print (Node* p) {
49
+ if (!p) return ;
50
+ pushDown (p);
51
+ print (p->l ), cout << p->val << ' ' , print (p->r );
52
+ return ;
53
+ }
54
+
55
+ public:
56
+ FhqTreap (void ) { root = NULL ; }
57
+ void build (int n) {
58
+ for (int i = 1 ; i <= n; i++) merge (root, root, new Node (i));
59
+ return ;
60
+ }
61
+ void reverse (int l, int r) {
62
+ Node *tc = NULL , *tr = NULL ;
63
+ split (root, root, tr, r), split (root, root, tc, l - 1 );
64
+ rev (tc);
65
+ merge (root, root, tc), merge (root, root, tr);
66
+ return ;
67
+ }
68
+ void print (void ) { return print (root), cout << endl, void (); }
69
+ } FHQ;
70
+
71
+ void solve (void ) {
72
+ int n, m;
73
+ cin >> n >> m;
74
+ FHQ.build (n);
75
+ for (int i = 1 ; i <= m; i++) {
76
+ int l, r;
77
+ cin >> l >> r;
78
+ FHQ.reverse (l, r);
79
+ }
80
+ FHQ.print ();
81
+ return ;
82
+ }
83
+
84
+ bool mem2;
85
+
86
+ int main () {
87
+ ios::sync_with_stdio (false );
88
+ #ifdef LOCAL
89
+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
90
+ #endif
91
+
92
+ int _ = 1 ;
93
+ while (_--) solve ();
94
+
95
+ #ifdef LOCAL
96
+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
97
+ #endif
98
+ return 0 ;
99
+ }
0 commit comments