Files
OI-source/1.3391.cpp
2023-08-03 09:22:52 +08:00

91 lines
1.5 KiB
C++

#include<cstdio>
#include<algorithm>
using namespace std;
struct Node
{
int v,s; char f;
Node* ch[2];
inline int cmp(int k)
{
int d=k-ch[0]->s;
return d==1?-1:d>1;
}
inline void push_up()
{ s=ch[0]->s+1+ch[1]->s; }
inline void push_down()
{
if(!f) return;
swap(ch[0],ch[1]);
ch[0]->f^=1;
ch[1]->f^=1;
f=0;
}
};
Node* null=new Node();
inline void rotate(Node* &o,int d)
{
Node* p=o->ch[d^1];
o->ch[d^1]=p->ch[d]; p->ch[d]=o;
o->push_up();
p->push_up();
o=p;
}
void splay(Node* &o,int k)
{
o->push_down();
int d=o->cmp(k);
if(d==1) k-=o->ch[0]->s+1;
if(d!=-1)
{
Node* &p=o->ch[d];
p->push_down();
int d2=p->cmp(k);
if(d2==1) k-=p->ch[0]->s+1;
if(d2!=-1)
{
splay(p->ch[d2],k);
if(d==d2) rotate(o,d^1);
else rotate(p,d);
}
rotate(o,d^1);
}
}
Node* build(int L,int R)
{
if(L>R) return null;
Node* res=new Node();
res->v=(L+R)>>1; res->f=0;
if(L==R) res->ch[0]=res->ch[1]=null;
else res->ch[0]=build(L,((L+R)>>1)-1),res->ch[1]=build(((L+R)>>1)+1,R);
res->push_up();
return res;
}
int n,m,a,b;
void print(Node* o)
{
o->push_down();
if(o==null) return;
print(o->ch[0]);
if(o->v>=1&&o->v<=n) printf("%d ",o->v);
print(o->ch[1]);
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
freopen("pro.out","w",stdout);
#endif
null->s=null->f=0; null->ch[0]=null->ch[1]=null;
scanf("%d%d",&n,&m);
Node* root=build(0,n+1);
while(m-->0)
{
scanf("%d%d",&a,&b);
splay(root,a);
splay(root->ch[1],b+2-root->ch[0]->s-1);
root->ch[1]->ch[0]->f^=1;
}
print(root);
return 0;
}