luogu P3391 【模板】文艺平衡树(Splay) 非旋转treap
Code:
#include<bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
namespace fhqtreap{
#define maxn 1000000
typedef pair<int,int>par;
#define mk make_pair
int n,m,rt,tot;
int lz[maxn],val[maxn],key[maxn],rs[maxn],ls[maxn],sz[maxn];
void up(int x){ sz[x]=sz[ls[x]]+sz[rs[x]]+1; }
void pd(int x){
if(!x||!lz[x]) return;
swap(ls[x],rs[x]),lz[x]^=1;
if(ls[x]) lz[ls[x]]^=1;
if(rs[x]) lz[rs[x]]^=1;
}
par split(int x,int k){
pd(x);
if(!k) return mk(0,x);
par t1,t2;
int lson=ls[x],rson=rs[x];
if(k==sz[ls[x]]) { ls[x]=0,up(x); return mk(lson,x); }
else if(k==sz[ls[x]]+1) { rs[x]=0,up(x); return mk(x,rson); }
else if(k < sz[ls[x]]) {
t1=split(ls[x],k);
ls[x]=t1.second,up(x);
return mk(t1.first,x);
}
else {
t1=split(rs[x],k-sz[ls[x]]-1);
rs[x]=t1.first,up(x);
return mk(x,t1.second);
}
}
int merge(int a,int b){
if(!a||!b) return a+b;
pd(a),pd(b);
if(key[a]<key[b]){
ls[b]=merge(a,ls[b]),up(b);
return b;
}
else{
rs[a]=merge(rs[a],b),up(a);
return a;
}
}
void print(int x){
if(!x) return;
pd(x);
print(ls[x]),printf("%d ",val[x]),print(rs[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
key[++tot]=rand(),val[tot]=i,sz[tot]=1;
rt=merge(rt,tot);
}
for(int x,y,i=1;i<=m;++i) {
scanf("%d%d",&x,&y);
par t1=split(rt,y);
par t2=split(t1.first,x-1);
lz[t2.second]^=1;
merge(merge(t2.first,t2.second),t1.second);
}
print(rt);
return 0;
}
};
int main(){
//setIO("input");
fhqtreap::main();
return 0;
}