FHQ 0 pts 求助

P3391 【模板】文艺平衡树

SilverLi @ 2023-05-23 17:40:18

#include <bits/stdc++.h>
using namespace std;
#define pi pair<int,int>
#define mk make_pair
#define lt first
#define rt second
const int N=1e5+5;
int pos,root;
struct FHQ {
    int l,r,v,pr,si,ad;
    //FHQ() {si=1,pr=rand();}
}t[N];
#define lx t[now].l
#define rx t[now].r
inline int NEW(int val) {
    t[++pos].pr=rand();
    t[pos].si=1;
    t[pos].v=val;
    return pos;
}
inline void updata(int u) {t[u].si=t[t[u].l].si+t[t[u].r].si+1;}
inline void down(int now) {
    if((!t[now].ad)||(!now))    return;
    if(lx)  t[lx].ad^=1;
    if(rx)  t[rx].ad^=1;
    swap(lx,rx);
    t[now].ad=0;
}
pi split(int u,int key) {
    if(u==0)    return mk(0,0);
    down(u);
    if(t[u].si<=key) {
        pi res=split(t[u].r,key);
        t[u].r=res.lt;
        updata(u);
        return mk(u,res.rt);
    }
    if(t[u].si>key) {
        pi res=split(t[u].l,key);
        t[u].l=res.rt;
        updata(u);
        return mk(res.lt,u);
    }
}
int merge(int u,int v) {
    if(u==0||v==0)  return u+v;
    if(t[u].pr>=t[v].pr) {
        down(u);
        t[u].r=merge(t[u].r,v);
        updata(u);
        return u;
    }
    if(t[u].pr<t[v].pr) {
        down(v);
        t[v].l=merge(u,t[v].l);
        updata(v);
        return v;
    }
}
inline void ins(int val) {
    //t[++pos].v=val;
    root=merge(root,NEW(val));
}
inline void rev(int l,int r) {
    pi res=split(root,l-1);
    pi r2=split(res.rt,r-l+1);
    t[r2.lt].ad^=1;
    int f=merge(res.lt,r2.lt);
    root=merge(f,r2.rt);
}
void print(int now) {
    down(now);
    if(lx)  print(lx);
    cout<<t[now].v<<' ';
    if(rx)  print(rx);
}
signed main() {
    srand(time(0));
    int n,Q;    cin>>n>>Q;
    for(int i=1;i<=n;++i)   ins(i);
    while(Q--) {
        int l,r;    cin>>l>>r;
        rev(l,r);
    }
    print(root);
    return 0;
}

|