利用双向链表,注意用数组记录位置,而不是指针
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<iomanip>
using namespace std;
int n, m;
int l[100005],r[100005];
void link(int index1,int index2){//将index1点和index2点相连接
r[index1] = index2;
l[index2] = index1;
}
int main(){
int Case = 0;
while (cin >> n >> m){
Case++;
for (int i = 1; i <= n; i++){
l[i] = i - 1;
r[i] = (i + 1) % (n + 1);
}
l[0] = n;
r[0] = 1;
int rev = 0;
for (int i = 0; i < m; i++){
int op;
cin >> op;
if (op == 4) rev = !rev;
else if(op==3){
int index1, index2;
cin >> index1 >> index2;
if (r[index2] == index1) swap(index1,index2);
int L1 = l[index1], R1 = r[index1];
int L2 = l[index2], R2 = r[index2];
if (r[index1] == index2){
link(L1, R1); link(index2, index1); link(index1,R2);
}
else{
link(L1, index2); link(index2, R1); link(L2, index1); link(index1,R2);
}
}
else{
int index1, index2;
cin >> index1 >> index2;
if (rev) op = 3 - op;
if (op == 1){
if (index1 == l[index2]) continue;
int L1 = l[index1], R1 = r[index1];
int L2 = l[index2], R2 = r[index2];
link(L1, R1); link(L2, index1); link(index1, index2);
}
if (op == 2){
if (r[index2] == index1) continue;
int L1 = l[index1], R1 = r[index1];
int L2 = l[index2], R2 = r[index2];
link(L1, R1); link(index2, index1); link(index1, R2);
}
}
}
long long amount = 0;
int b=0;
for (int i = 1; i <= n; i++){
b = r[b];
if (i % 2==1) amount += b;
}
if (rev&&(n % 2==0)) amount = (long long )n*(n + 1) / 2 - amount;
cout <<"Case "<<Case<<": "<< amount << endl;
}
return 0;
}