1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream> #include <cstdio> #define MAXN 1000
#define left le*/ using namespace std;
int right[MAXN], left[MAXN];
void link(int x, int y) { right[x] = y; left[y] = x; }
int main() { int n, m, kase = 0; while(scanf("%d%d", &n, &m) != EOF){ for(int i = 1; i <= n; i++){ left[i] = i - 1; right[i] = (i + 1) % (n + 1); } right[0] = 1; left[0] = n; int op, x, y, flag = 0;
while(m--){ scanf("%d", &op); if(op == 4) flag = !flag; else{ scanf("%d%d", &x, &y); if(op != 3 && flag) op = 3 - op; if(op == 1 && x == left[y]) continue; if(op == 2 && x == right[y]) continue;
int lx = left[x], rx = right[x], ly = left[y], ry = right[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(right[x] == y) {link(lx, y); link(y, x); link(x, ry);} else if(right[y] == x) {link(ly, x); link(x, y); link(y, rx);} else{link(lx, y); link(y, rx); link(ly, x); link(x, ry);} } } }
int b = 0; int ans = 0; for(int i = 1; i <= n; i++){ b = right[b]; if(i % 2 == 1) ans += b; } if(flag && n % 2 == 0) ans = (1 + n) * n / 2 - ans; printf("Case %d: %d\n", ++kase,ans); }
return 0; }
|