感觉比普通平衡树易懂
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
struct Node{
int p, s[2], mark;
int v, tag, size;
void init(int p1, int v1){
p = p1, v = v1, size = 1;
}
}tr[N];
int root, idx;
int n, q;
void pushdown(int x){
if(tr[x].tag == 0)return;
swap(tr[x].s[0], tr[x].s[1]);
tr[tr[x].s[0]].tag ^= 1;
tr[tr[x].s[1]].tag ^= 1;
tr[x].tag = 0;
}
int get_k(int k){
int x = root;
while(1){
pushdown(x);
int y = tr[x].s[0];
if(tr[y].size + 1 < k){
k -= tr[y].size + 1;
x = tr[x].s[1];
}
else if(tr[y].size >= k) x = y;
else return x;
}
}
void pushup(int x){
tr[x].size = tr[tr[x].s[0]].size
+ tr[tr[x].s[1]].size + 1;
}
void rotate(int x){
int y = tr[x].p, z = tr[y].p;
int k = tr[y].s[1] == x;
tr[z].s[tr[z].s[1] == y] = x;
tr[x].p = z, tr[y].p = x;
tr[y].s[k] = tr[x].s[k ^ 1];
tr[tr[x].s[k ^ 1]].p = y;
tr[x].s[k ^ 1] = y;
pushup(y), pushup(x);
}
void splay(int x, int k){
while(tr[x].p != k){
int y = tr[x].p, z = tr[y].p;
if(z != k){
(tr[y].s[0] == x) ^ (tr[z].s[0] == y)
? rotate(y) : rotate(x);
}
rotate(x);
}
if(k == 0) root = x;
}
void insert(int v){
int x = root, p = 0;
while(x)p = x, x = tr[x].s[v > tr[x].v];
x = ++ idx;
tr[p].s[v > tr[p].v] = x;
tr[x].init(p, v);
splay(x, 0);
}
void output(int x){
pushdown(x);
if(tr[x].s[0]) output(tr[x].s[0]);
if(tr[x].v >= 1 && tr[x].v <= n)
printf("%d ", tr[x].v);
if(tr[x].s[1]) output(tr[x].s[1]);
}
int main(){
scanf("%d%d", &n, &q);
insert(-1e6), insert(1e6);
for(int i = 1;i <= n;i ++) insert(i);
while(q --){
int l, r;
scanf("%d%d", &l, &r);
l = get_k(l), r = get_k(r + 2);
splay(l, 0), splay(r, l);
tr[tr[r].s[0]].tag ^= 1;
}
output(root);
return 0;
}