1+ std::random_device seed;
2+ std::mt19937 rnd (seed());
3+
4+ int n, q;
5+
6+ struct node
7+ {
8+ int sz, key, val, ls, rs, lazy;
9+ }tree[MAXN];
10+ int rt, tot, t1, t2, t3;
11+
12+ int new_node (int v)
13+ {
14+ tree[++tot] = {1 , int (rnd ()), v, 0 , 0 , 0 };
15+ return tot;
16+ }
17+
18+ void push_up (int u)
19+ {
20+ tree[u].sz = tree[tree[u].ls ].sz + tree[tree[u].rs ].sz + 1 ;
21+ }
22+
23+ void push_down (int u)
24+ {
25+ if (tree[u].lazy )
26+ {
27+ std::swap (tree[u].ls , tree[u].rs );
28+ if (tree[u].ls ) tree[tree[u].ls ].lazy ^= 1 ;
29+ if (tree[u].rs ) tree[tree[u].rs ].lazy ^= 1 ;
30+ tree[u].lazy = 0 ;
31+ }
32+ }
33+
34+ void split_by_rnk (int u, int k, int &x, int &y)
35+ {
36+ if (!u)
37+ {
38+ x = y = 0 ;
39+ return ;
40+ }
41+ int t = tree[tree[u].ls ].sz + 1 ;
42+ push_down (u);
43+
44+ if (tree[tree[u].ls ].sz + 1 <= k)
45+ {
46+ x = u;
47+ split_by_rnk (tree[u].rs , k - tree[tree[u].ls ].sz - 1 , tree[u].rs , y);
48+ }
49+ else
50+ {
51+ y = u;
52+ split_by_rnk (tree[u].ls , k, x, tree[u].ls );
53+ }
54+
55+ push_up (u);
56+ }
57+
58+ int merge (int x, int y)
59+ {
60+ if (!x || !y) return x + y;
61+
62+ if (tree[x].key > tree[y].key )
63+ {
64+ push_down (x);
65+ tree[x].rs = merge (tree[x].rs , y);
66+ push_up (x);
67+ return x;
68+ }
69+ else
70+ {
71+ push_down (y);
72+ tree[y].ls = merge (x, tree[y].ls );
73+ push_up (y);
74+ return y;
75+ }
76+ }
77+
78+ void dfs (int u)
79+ {
80+ if (!u) return ;
81+ push_down (u);
82+ dfs (tree[u].ls );
83+ std::cout << tree[u].val << " " ;
84+ dfs (tree[u].rs );
85+ }
86+
87+ void solve ()
88+ {
89+ std::cin >> n >> q;
90+ for (int i = 1 ; i <= n; ++i)
91+ {
92+ rt = merge (rt, new_node (i));
93+ }
94+
95+ while (q--)
96+ {
97+ int l, r;
98+ std::cin >> l >> r;
99+ split_by_rnk (rt, r, t1, t2);
100+ split_by_rnk (t1, l - 1 , t1, t3);
101+ tree[t3].lazy ^= 1 ;
102+ rt = merge (merge (t1, t3), t2);
103+ }
104+
105+ dfs (rt);
106+ }
0 commit comments