异或并查集
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
#define eps 1e-8
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3fLL
#define _clr(x,a) memset(x,a,sizeof(x))
#define min(a,b)) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define rep(i,n) for(int i=1;i<=n;++i)
using namespace std;
//#define sponge_wxy_code
const int maxn = 20010;
int parent[maxn], val[maxn];
int n, q;
int K, num[20];
char str[1010];
void init_set() {
for(int i = 0; i <= n; ++i) {
parent[i] = i;
val[i] = 0;
}
return ;
}
int find_set(int u) {
if(parent[u] != u) {
int temp = parent[u];
parent[u] = find_set(parent[u]);
val[u] ^= val[temp];
//val[u] ^= val[temp];
}
return parent[u];
}
void union_set(int r1, int r2, int u, int v, int c) {
if(r1 == n) swap(r1, r2);
val[r1] = (val[u]^val[v]^c);
parent[r1] = r2;
return ;
}
int query() {
bool visit[20]; int ans = 0;
memset(visit, false, sizeof(visit));
for(int i = 0; i < K; ++i) {
if(visit[i]) continue;
int root = find_set(num[i]), cnt = 0;
for(int j = i; j < K; ++j) {
if(!visit[j] && (root == find_set(num[j]))) {
visit[j] = true; cnt++;
ans ^= val[num[j]];
}
}
if((cnt&1) && root != n) return -1;
}
return ans;
}
int main() {
#ifdef sponge_wxy_code
freopen("aa.in", "r", stdin);
freopen("bb.out", "w", stdout);
#endif
int kcase = 0;
while(scanf("%d %d", &n, &q)) {
if(n == 0 && q == 0) break;
printf("Case %d:\n", ++kcase);
init_set();
bool flag = false; int cas = 0;
while(q--) {
scanf("%s", str);
if(str[0] == 'I') {
getchar(); gets(str); cas++;
int space = 0, u, v, w;
for(int i = 0; i < (int)strlen(str); ++i) space = space + (str[i] == ' ');
if(space == 1) {
sscanf(str, "%d %d", &u, &w);
v = n;
} else {
sscanf(str, "%d %d %d", &u, &v, &w);
}
if(flag) continue;
int r1 = find_set(u), r2 = find_set(v);
if(r1 == r2 && (val[u]^val[v]) != w) {
flag = true;
printf("The first %d facts are conflicting.\n", cas);
} else {
union_set(r1, r2, u, v, w);
}
} else {
scanf("%d", &K);
for(int i = 0; i < K; ++i) scanf("%d", &num[i]);
if(flag) continue;
int ans = query();
if(ans == -1) {
printf("I don't know.\n");
} else {
printf("%d\n", ans);
}
}
}
printf("\n");
}
return 0;
}