splay区间插入

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005,inf=1<<30;
int sz[N],cnt[N],ch[N][2],fa[N],root,a[N],key[N],tot,lazy[N];
int n,m;
int judge(int u){
	return ch[fa[u]][1]==u;
}
void pushup(int u){
	sz[u]=sz[ch[u][0]]+sz[ch[u][1]]+cnt[u];
}
void pushdown(int u){
	if(lazy[u]){
		swap(ch[u][0],ch[u][1]);
		lazy[ch[u][0]]^=1;
		lazy[ch[u][1]]^=1;
		lazy[u]=0;
	}
}
void link(int u,int f,int d){
	ch[f][d]=u;
	fa[u]=f;
}
int node(int num,int c){
	key[++tot]=num;
	sz[tot]=cnt[tot]=c;
	return tot;
}
int build(int l,int r){
	if(l>r){
		return 0;
	}
	int mid=(l+r)>>1;
	int u=node(a[mid],1);
	int ls=build(l,mid-1);
	if(ls){
		link(ls,u,0);
	}
	int rs=build(mid+1,r);
	if(rs){
		link(rs,u,1);
	}
	pushup(u);
	return u;
}
void init(){
	root=node(-inf,0);
	int u=node(inf,1);
	link(u,root,1);
	link(build(1,n),u,0);
}
void rotate(int u){
	int j=judge(u),fat=fa[u];
	int anc=fa[fat],jf=judge(fat);
	if(!anc){
		fa[u]=0;
	}
	else{
		link(u,anc,jf);
	}
	link(ch[u][!j],fat,j);
	link(fat,u,!j);
	pushup(fat);
	pushup(u);
}
void splay(int u,int f){
	for(;fa[u]!=f;rotate(u)){
		int fat=fa[u],anc=fa[fat];
		if(anc!=f){
			if(judge(u)==judge(fat)){
				rotate(fat);
			}
			else{
				rotate(u);
			}
		}
	}
	if(!f){
		root=u;
	}
}
int kth(int u){
	int now=root;
	for(;;){
		pushdown(now);
		if(ch[now][0]&&u<=sz[ch[now][0]]){
			now=ch[now][0];
		}
		else{
			if(u<=sz[ch[now][0]]+cnt[now]){
				return now;
			}
			u-=sz[ch[now][0]]+cnt[now];
			now=ch[now][1];
		}
	}
}
void reverse(int l,int r){
	int kl=kth(l-1),kr=kth(r+1);
	splay(kl,0);
	splay(kr,kl);
	lazy[ch[kr][0]]^=1;
}
void output(int u){
	pushdown(u);
	if(ch[u][0]){
		output(ch[u][0]);
	}
	if(key[u]>0&&key[u]<=n){
		printf("%d ",key[u]);
	}
	if(ch[u][1]){
		output(ch[u][1]);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		a[i]=i;
	}
	init();
	int x,y;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		reverse(x,y);
	}
	output(root);
	return 0;
}
posted @ 2020-05-17 17:28  prestige  阅读(199)  评论(0编辑  收藏  举报