#include <vector>
#include <map>
#include<algorithm>
#include<cmath>
#include<set>
#include<cstdio>
#include <sstream>
#include <string>
#include<iostream>
#include<iomanip>
#include<stack>
#include<utility>
#include<unordered_map>
#include<queue>
#include<cstring>
#include <list>
#include<deque>
const int maxn = 100000 + 10;
int right0[maxn];
int left0[maxn];
void Link(int L, int R)
{
right0[L] = R;
left0[R] = L;
}
using namespace std;
int main()
{
int m, n;
int kase = 0;
while (scanf("%d%d", &n, &m) == 2)
{
for (int i = 1; i <= n; ++i)
{
left0[i] = i - 1;
right0[i] = (i + 1) % (n + 1);
}
right0[0] = 1;
left0[0] = n;
int op, X, Y, inv = 0;
while (m--)
{
scanf("%d", &op);
if (op == 4)
inv = !inv;
else
{
scanf("%d%d", &X, &Y);
if (op == 3 && right0[Y] == X)
swap(X, Y);
if (op != 3 && inv)op = 3 - op;
if (op == 1 && X == left0[Y])continue;
if (op == 2 && X == right0[Y])continue;
int LX = left0[X], RX = right0[X], LY = left0[Y], RY = right0[Y];
if (op == 1)
{
Link(LX, RX); Link(LY, X); Link(X, Y);
}
else if (op == 2)
{
Link(LX, RX); Link(Y, X); Link(X, RY);
}
else if (op == 3)
{
if (right0[X] == Y) { Link(LX, Y); Link(Y, X); Link(Y, X); Link(X, RY); }
else { Link(LX, Y); Link(Y, RX); Link(LY, X); Link(X, RY); }
}
}
}
int b = 0;
long long ans = 0;
for (int i = 1; i <= n; ++i)
{
b = right0[b];
if (i % 2 == 1)
ans += b;
}
if (inv && n % 2 == 0)ans = (long long)n * (n + 1) / 2 - ans;
printf("Case %d: %lld\n", ++kase, ans);
}
return 0;
}
紫书UVa12657
最新推荐文章于 2020-12-12 17:52:15 发布