显示代码纯文本
- #pragma G++ optimize("O3")
- #include<cstdio>
- #include<iostream>
- namespace FIFO
- {
- char ch;
- char B[1<<20],*S=B,*T=B;
- #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<20,stdin),S==T)?0:*S++)
- #define isd(c) (c>='0'&&c<='9')
- int aa,bb;int F(){
- while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
- while(ch=getc(),isd(ch))aa=aa*10+ch-'0';return aa;
- }
- }
- #define gi FIFO::F()
- class Troy{
- public:
- Troy(){
- for(top;top<siez;top++)
- stk[top]=tree+top;
- }
- void print(){
- dfs(root);
- }
- void build(int l,int r){
- int mid=l+r>>1;
- root=newnode(mid,NULL);
- root->son[0]=build(l,mid-1,root);
- root->son[1]=build(mid+1,r,root);
- }
- void change(int l,int r){
- node *t=find(l);
- splay(t,NULL);
- t=find(r+2);
- splay(t,root);
- root->son[1]->son[0]->lazy^=1;
- }
- private:
- struct node{
- int v,size,lazy;
- node *son[2],*f;
- }*root;
- const static int siez=100100;
- node *stk[siez],tree[siez];int top;
- inline node * newnode(int v,node *f){
- node *t=stk[--top];
- t->size=1;
- t->lazy=0;
- t->v=v;
- t->son[1]=t->son[0]=NULL;
- t->f=f;
- return t;
- }
- node *build (int l,int r,node *f){
- if(l>r) return NULL;
- int mid=l+r>>1;
- node *t=newnode(mid,f);
- t->son[0]=build(l,mid-1,t);
- t->son[1]=build(mid+1,r,t);
- return update(t),t;
- }
- inline int size(node *t){
- return t==NULL ?0:t->size;
- }
- inline void update(node *t){
- t->size=1+size(t->son[0])+size(t->son[1]);
- }
- void updown(node *t){
- if(t!=NULL){
- std::swap(t->son[0],t->son[1]);
- if(t->son[0]!=NULL)
- t->son[0]->lazy^=1;
- if(t->son[1]!=NULL)
- t->son[1]->lazy^=1;
- t->lazy=0;
- }
- }
- inline bool son(node* f,node* s){
- if(f==NULL) return 0;
- return f->son[1]==s;
- }
- inline void connect(node *f,node *s,bool k){
- if(f!=NULL) f->son[k]=s;
- else root=s;
- if(s!=NULL) s->f=f;
- }
- inline void rotate(node* t){
- node *f=t->f,*g=f->f;
- bool a=son(f,t),b=!a;
- connect(f,t->son[b],a);
- connect(g,t,son(g,f));
- connect(t,f,b);
- update(f);
- update(t);
- }
- inline void splay(node *t,node *p){
- if(t){
- while(t->f!=p){
- node *f =t->f,*g=f->f;
- if(g==p) rotate(t);
- else{
- if(son(g,f)^son(f,t))
- rotate(t),rotate(t);
- else
- rotate(f),rotate(t);
- }
- }
- }
- }
- inline node *find(int kth){
- for(node *now=root;;){
- if(now->lazy){
- updown(now);
- }
- if(kth>size(now->son[0])){
- kth-=size(now->son[0]);
- if(kth==1) return now;
- else now=now->son[1],kth--;
- }
- else
- now=now->son[0];
- }
- }
- inline void dfs(node *t){
- if(t->lazy){
- updown(t);
- }
- if(t->son[0]!=NULL)
- dfs(t->son[0]);
- if(t->v!=0&&t->v!=size(root)-1)
- printf("%d ",t->v);
- if(t->son[1]!=NULL)
- dfs(t->son[1]);
- }
- }war;
- int n,m;
- int main(){
- freopen("sph.in","r",stdin);
- freopen("sph.out","w",stdout);
- n=gi,m=gi;
- int l,r;
- war.build(0,n+1);
- for(int i=1;i<=m;i++ ){
- l=gi,r=gi;
- war.change(l,r);
- }
- war.print();
- }