EZIOPQR @ 2019-04-04 21:56:31
样例能过,提交0分
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
struct node{
int num,cnt,size,fa,child[2];
}p[1000099];
int n,m;
int rev[1000099];
int cnt;
int root;
void pushup(int x){
p[x].size=p[x].cnt+p[p[x].child[0]].size+p[p[x].child[1]].size;
}
void pushdown(int x){
if(rev[x]){
swap(p[x].child[0],p[x].child[1]);
rev[p[x].child[0]]^=1;
rev[p[x].child[1]]^=1;
rev[x]=0;
}
}
bool getSon(int x){
return p[p[x].fa].child[1]==x;
}
void rotate(int x){
/*
int y=p[x].fa;
int z=p[y].fa;
int k=getSon(x);
if(getSon(y)){
p[z].child[1]=x;
}else{
p[z].child[0]=x;
}
if(getSon(x)){
p[y].child[1]=p[x].child[0];
p[x].child[0]=y;
p[y].fa=x;
p[x].fa=z;
p[p[y].child[1]].fa=y;
}else{
p[y].child[0]=p[x].child[1];
p[x].child[1]=y;
p[y].fa=x;
p[x].fa=z;
p[p[y].child[0]].fa=y;
}*/
int y=p[x].fa;
int z=p[y].fa;
int k=getSon(x);
int w=p[x].child[k^1];
p[y].child[k]=w;
p[w].fa=y;
p[z].child[getSon(y)]=x;
p[x].fa=z;
p[x].child[k^1]=y;
p[y].fa=x;
pushup(y);
pushup(x);
}
void splay(int x,int goal){
while(p[x].fa!=goal){
int y=p[x].fa;
int z=p[y].fa;
//cout<<"ok"<<y<<endl;
if(z!=goal){
if(getSon(x)==getSon(y)) rotate(y);
else rotate(x);
}
rotate(x);
}
if(!goal) root=x;
}
void insert(int x){
int cur=root,par=0;
while(cur&&p[cur].num!=x){
par=cur;
cur=p[cur].child[x>p[cur].num];
}
if(cur) p[cur].cnt++;
else{
cur=++cnt;
if(par){
p[par].child[x>p[par].num]=cur;
}
p[cur].child[0]=p[cur].child[1]=0;
p[cur].fa=par;
p[cur].num=x;
p[cur].size=p[cur].cnt=1;
//pushup(par);
}
splay(cur,0);
}
int kth(int k){
int cur=root;
while(1){
if(p[cur].child[0]&&k<=p[p[cur].child[0]].size){
cur=p[cur].child[0];
}else if(p[p[cur].child[0]].size+p[cur].cnt<k){
k-=p[p[cur].child[0]].size+p[cur].cnt;
cur=p[cur].child[1];
}else{
return cur;
}
}
}
void reverse(int l,int r){
int x=kth(l),y=kth(r+2);
splay(x,0);
splay(y,x);
rev[p[y].child[0]]^=1;
}
void dfs(int x){
pushdown(x);
if(p[x].child[0]) dfs(p[x].child[0]);
if(p[x].num&&p[x].num<=n) printf("%d ", p[x].num);
if(p[x].child[1]) dfs(p[x].child[1]);
}
int main(){
scanf("%d%d", &n, &m);
for(int i=0;i<=n+1;i++) insert(i);
//dfs(root);
while(m--){
int x,y;
scanf("%d%d", &x, &y);
reverse(x,y);
}
dfs(root);
return 0;
}