/*题意:你有一行盒子,从左到右依次编号为1, 2, 3,…, n。你可以执行四种指令:
1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令)。
2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令)。
3 X Y表示交换盒子X和Y的位置。
4 表示反转整条链。
盒子个数n和指令条数m(1<=n,m<=100,000)*/
#include
#include
using namespace std;
int r[100010];
int l[100010];
void link(int x,int y)
{
l[y]=x;
r[x]=y;
}
void moveleft(int x,int y)
{
link(l[x],r[x]);
link(l[y],x);
link(x,y);
}
void moveright(int x,int y)
{
link(l[x],r[x]);
link(x,r[y]);
link(y,x);
}
void exchange(int x,int y)
{
int ll,rl,lr,rr;
ll=l[x];rl=r[x];lr=l[y];rr=r[y];
if(ll==y)
{
link (lr,x);
link (x,y);
link (y,rl);
}
else if (x==lr)
{
link (ll,y);
link (y,x);
link (x,rr);
}
else
{
link (ll,y);
link (y,rl);
link (lr,x);
link (x,rr);
}
}
int main()
{
int i,m,n,j,k,t=0;
long long sum;
while(scanf("%d %d",&n,&m)!=EOF)
{
k=0;
memset (r,0,sizeof(r));
memset (l,0,sizeof(l));
for (i=0;i<=n;i++)
link (i,i+1);
for(j=0;j