文件详细信息
本文件的大小为 2663 字节。
#include<algorithm>
#include<cstdio>
namespace IO{
const int ARR_SIZE=1<<24;
#define gc() ((IO::si!=IO::ti||(IO::ti=(IO::si=IO::input)+fread(IO::input,1,IO::ARR_SIZE,stdin))),IO::si!=IO::ti?*(IO::si++):EOF)
#define pc(ch) ((IO::o.so!=IO::o.to||(fwrite(IO::o.output,1,IO::ARR_SIZE,stdout),IO::o.so=IO::o.output)),*(IO::o.so++)=ch)
char input[ARR_SIZE],*si=input,*ti=input;
struct Output_Stream{
char output[ARR_SIZE],*so=output,*to=output+ARR_SIZE;
~Output_Stream(){
if(so==output)return;
fwrite(output,1,so-output,stdout);
so=output;
}
}o;
template<typename T>
void read(T&num){
int ch=gc();
num=0;
while(ch<48||ch>57)ch=gc();
while(ch>=48&&ch<=57)num=(num<<3)+(num<<1)+(ch^48),ch=gc();
}
template<typename T>
void write(T a){
static int ch[50],cnt=0;
if(a==0)pc('0');
while(a)ch[++cnt]=a%10|48,a/=10;
while(cnt)pc(ch[cnt--]);
}
}
using IO::read;
using IO::write;
const int maxn=100000,inf=0x3f3f3f3f;
struct Node{
Node*ch[2],*fa;
int size,val,tag;
}T[maxn+3],*rt;
int n,m,tot,cnt;
void maintain(Node*u){
u->size=u->ch[0]->size+u->ch[1]->size+1;
}
void pushdown(Node*u){
if(u==T||!u->tag)return;
std::swap(u->ch[0],u->ch[1]);
if(u->ch[0]!=T)u->ch[0]->tag^=1;
if(u->ch[1]!=T)u->ch[1]->tag^=1;
u->tag=0;
}
void clear(Node*u){
u->ch[0]=u->ch[1]=u->fa=T;
u->size=u->val=u->tag=0;
}
int get(const Node*x){
return x==x->fa->ch[1];
}
void rotate(Node*x){
Node*y=x->fa,*z=y->fa;
int k=get(x);
pushdown(y);
pushdown(x);
y->ch[k]=x->ch[k^1];
if(y->ch[k]!=T)y->ch[k]->fa=y;
(x->ch[k^1]=y)->fa=x;
x->fa=z;
if(z!=T)z->ch[z->ch[1]==y]=x;
maintain(y);
maintain(x);
}
void splay(Node*x,Node*target){
for(Node*f=x->fa;f=x->fa,f!=target;rotate(x))
if(f->fa!=target)
rotate(get(x)==get(f)?f:x);
if(target==T)rt=x;
}
Node*kth(int k){
k++;
Node*u=rt;
while(true){
pushdown(u);
if(k<=u->ch[0]->size)u=u->ch[0];
else{
k-=u->ch[0]->size+1;
if(k==0){
splay(u,T);
return u;
}
u=u->ch[1];
}
}
}
Node*build(Node*fa,const int l,const int r){
const int mid=(l+r)>>1;
Node*u=T+(++tot);
clear(u);
u->val=(mid==0)?-inf:(mid==n+1)?inf:mid;
u->fa=fa;
u->ch[0]=l<mid?build(u,l,mid-1):T;
u->ch[1]=mid<r?build(u,mid+1,r):T;
maintain(u);
return u;
}
void turn(const int l,const int r){
Node*x=kth(l-1),*y=kth(r+1);
splay(x,T);
splay(y,x);
rt->ch[1]->ch[0]->tag^=1;
}
void output(Node*u){
pushdown(u);
if(u->ch[0]!=T)output(u->ch[0]);
if(u->val>=1&&u->val<=n)write(u->val),pc((++cnt)!=n?' ':'\n');
if(u->ch[1]!=T)output(u->ch[1]);
}
int main(){
read(n),read(m);
clear(T);
rt=build(T,0,n+1);
for(int i=1,l,r;i<=m;i++){
read(l),read(r);
turn(l,r);
}
output(rt);
return 0;
}