input:
6 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4
output:
Case1:12
Case2:9
Case3:2500050000
//由于进uva评测总是出问题,所以一下代码只是通过以上测试用例,没有实际评测AC过,不过思路大概差不多
//题目比较简单,作为STL的list容器的练习很合适
#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
#include<stack>
#include<list>
#include<algorithm>
using namespace std;
int main(){
int kl = 1;//作为case的序号
int n,m;
while(cin>>n>>m){//箱子n,指令数m
list<int>li;
for(int i=1;i<n+1;i++){//初始化链表
li.push_back(i);
}
for(int i = 0;i<m;i++){
int ord,a,b;
cin>>ord;
list<int>::iterator iter;
if(ord==1){
cin>>a>>b;
iter = find(li.begin(),li.end(),a);
if(iter!=li.end()){//按题意说应该是一定能找到的
li.erase(iter);
}
iter = find(li.begin(),li.end(),b);
if(iter!=li.end()){
li.insert(iter,a);//插左
}
}
else if(ord==2){
cin>>a>>b;
iter = find(li.begin(),li.end(),a);
if(iter!=li.end()){
li.erase(iter);
}
iter = find(li.begin(),li.end(),b);
if(iter!=li.end()){
li.insert(++iter,a);//插右
}
}
else if(ord==3){//交换采用的是找到后保存指针然后交换值
cin>>a>>b;
int x,y;
list<int>::iterator it1;
list<int>::iterator it2;
iter = find(li.begin(),li.end(),a);
if(iter!=li.end()){
it1 = iter;
x=*iter;//也可以不用保存值毕竟都保存指针了,到时候交换的时候用个temp也行
}
iter = find(li.begin(),li.end(),b);
if(iter!=li.end()){
it2 = iter;
y=*iter;
}
*it1 = y;
*it2 = x;
}
else if(ord==4){//反转上没找到比较好的方法,貌似reserve()不能实现?没具体研究,使用就用了简单粗暴的遍历反转
list<int>l;
for(iter = li.begin();iter!=li.end();iter++){
l.push_front(*iter);
}
li=l;
}
}
cout<<"Case"<<kl++<<":";
int k = 1;
long long sum = 0;
for(list<int>::iterator iter=li.begin();iter!=li.end();iter++,k++){
int v= *iter;
if(k%2==1)sum+=v;
}cout<<sum<<endl;
}
return 0;
}