用两个数组,一个表示队列,另一个保存每个学号在队列中什么位置,方便定位学号
接下来就是按情况模拟操作
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1000+10;
int pos[N],que[N];
int main()
{
int n,m,a,b;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
pos[i]=que[i]=i;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
int p=pos[a];
if(b>0)
for(int i=p;i<p+b;i++)
{
que[i]=que[i+1];
pos[que[i]]--;
}
else
for(int i=p;i>p+b;i--)
{
que[i]=que[i-1];
pos[que[i]]++;
}
que[p+b]=a;
pos[a]=p+b;
}
for(int i=1;i<n;i++) printf("%d ",que[i]);
printf("%d\n",que[n]);
return 0;
}