直接用STL 的 list 就可以,比赛以为不行,自己手动模拟 list 去了。。。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=150000+100;
list<int>List[maxn];
list<int>RevList[maxn];
int main(){
int n,q;
list<int>::iterator it;
while(scanf("%d%d",&n,&q)==2){
for(int i=1;i<=n;i++) List[i].clear(),RevList[i].clear();
while(q--){
int type;
scanf("%d",&type);
if(type==1){
int u,w,v;
scanf("%d%d%d",&u,&w,&v);
if(w==1) List[u].push_back(v),RevList[u].push_front(v);
else List[u].push_front(v),RevList[u].push_back(v);
}
else if(type==2){
int u,w;
scanf("%d%d",&u,&w);
if(List[u].empty()){
printf("-1\n");
continue;
}
if(w==1){
printf("%d\n",List[u].back());
List[u].pop_back();
RevList[u].pop_front();
}
else{
printf("%d\n",List[u].front());
List[u].pop_front();
RevList[u].pop_back();
}
}
else{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w==1) List[u].splice(List[u].end(),RevList[v]),RevList[u].splice(RevList[u].begin(),List[v]);
else List[u].splice(List[u].end(),List[v]),RevList[u].splice(RevList[u].begin(),RevList[v]);
// for(it=List[u].begin();it!=List[u].end();it++) printf("%d ",*it);
// printf("List end\n");
// for(it=RevList[u].begin();it!=RevList[u].end();it++) printf("%d ",*it);
// printf("RevList end\n");
}
}
}
}