#include <bits/stdc++.h>
#define mod 1000000007
typedef long long LL;
typedef double D;
using namespace std;
const int SIZE=1000010;
// mt19937 Rand(time(0));
int n,m;
int tot;
int root,l,r,p;
struct treap
{
int ls,rs,val,ran;
int siz;
bool tag;
}t[SIZE<<1];
int read()
{
int res=0,x=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')x=-1;ch=getchar();}
while(isdigit(ch)){res=(res<<3)+(res<<1)+(ch^48);ch=getchar();}
return x*res;
}
void up(int id)
{
t[id].siz=t[t[id].ls].siz+t[t[id].rs].siz+1;
return;
}
void pushDown(int id)
{
if(t[id].tag)
{
t[id].tag=0;
swap(t[id].ls,t[id].rs);
t[t[id].ls].tag^=1;
t[t[id].rs].tag^=1;
}
return;
}
void split(int id,int x,int &l,int &r)
{
if(!id)
{
l=r=0;
return ;
}
if(t[t[id].ls].siz<=x)
{
pushDown(id);
l=id;
split(t[id].rs,x-t[t[id].ls].siz-1,t[id].rs,r);
up(id);
}
else
{
pushDown(id);
r=id;
split(t[id].ls,x,l,t[id].ls);
up(id);
}
return;
}
int merge(int l,int r)
{
if(!l || !r) return l+r;
if(t[l].ran<=t[r].ran)
{
pushDown(l);
t[l].rs=merge(t[l].rs,r);
up(l);
return l;
}
else
{
pushDown(r);
t[r].ls=merge(l,t[r].ls);
up(r);
return r;
}
}
void insert(int i)
{
t[++tot].val=i;
t[tot].siz=1;
t[tot].ran=rand();
t[tot].tag=0;
split(root,i,l,r);
root=merge(merge(l,tot),r);
return;
}
void reversal(int x,int y)
{
split(root,x-2,l,r);
split(r,y-x,r,p);
t[r].tag^=1;
root=merge(l,merge(r,p));
return;
}
void midout(int id)
{
if(!id) return ;
pushDown(id);
midout(t[id].ls);
printf("%d ",t[id].val);
midout(t[id].rs);
return;
}
signed main()
{
srand(time(0));
n=read(),m=read();
for(int i=1;i<=n;i++) insert(i);
while(m--)
{
int x=read(),y=read();
reversal(x,y);
}
midout(root);
return 0;
}
先试了mt19937 time(0),又试了rand(),但结果都随机。
PS: 不是很懂随机数