0
点赞
收藏
分享

微信扫一扫

[小刷平衡树] P3391 【模板】文艺平衡树


BAIXUELE, HUILUCHONGZAOBA

存个板子,开搞

Code

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

const int N = 1e6 + 10;

namespace FHQ{
int lson[N], rson[N], val[N], key[N], siz[N];
bool lazy[N];
int tot, root;

std::mt19937 Rand(114514);

inline void make_node(int &rt, int x){
val[rt = ++tot] = x, key[rt] = Rand(), siz[rt] = 1;
}

inline void push_up(int rt){
siz[rt] = siz[lson[rt]] + siz[rson[rt]] + 1;
}

inline void push_down(int rt){
if(!lazy[rt]) return;
swap(lson[rt], rson[rt]);
if(lson[rt]) lazy[lson[rt]] ^= 1;
if(rson[rt]) lazy[rson[rt]] ^= 1;
lazy[rt] = false;
}

void split(int rt, int &u, int &v, int x){
if(!rt) return (void)(u = v = 0);
push_down(rt);
if(x > siz[lson[rt]]) u = rt, split(rson[rt], rson[rt], v, x - siz[lson[rt]] - 1);
else v = rt, split(lson[rt], u, lson[rt], x);
push_up(rt);
}

int merge(int u, int v){
if(!u || !v) return u + v;
if(key[u] < key[v]){
push_down(u);
rson[u] = merge(rson[u], v);
return push_up(u), u;
} else {
push_down(v);
lson[v] = merge(u, lson[v]);
return push_up(v), v;
}
}

void insert(int x){
int new_node; make_node(new_node, x);
root = merge(root, new_node);
}

void print_mid(int rt){
if(!rt) return;
push_down(rt);
print_mid(lson[rt]);
cout << val[rt] << " ";
print_mid(rson[rt]);
}
}

using FHQ::root;

inline void solve(){
int n = 0, m = 0; cin >> n >> m;
for(int i = 1; i <= n; i++) FHQ::insert(i);
for(int i = 1; i <= m; i++){
int l, r; cin >> l >> r;
int a = 0, b = 0, c = 0;
FHQ::split(root, a, b, l - 1);
FHQ::split(b, b, c, r - l + 1);
FHQ::lazy[b] ^= 1;
root = FHQ::merge(a, FHQ::merge(b, c));
}
FHQ::print_mid(root);
}

signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 1; // cin >> t;
while(t--) solve();
return 0;
}


举报

相关推荐

0 条评论