三值逻辑
#include<bits/stdc++.h>
using namespace std;
int f[200005];
int sz[200005];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y){
int f1=find(x);
int f2=find(y);
if(f1==f2){
return ;
}
f[f1]=f2;
sz[f2]+=sz[f1];
}
char tfu[200005];
int main(){
int c,t;
scanf("%d%d",&c,&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
memset(tfu,'0',sizeof tfu);
for(int i=1;i<=2*n;i++){
f[i]=i;
}
for(int i=1;i<=n;i++){
sz[i]=1;
}
for(int i=n+1;i<=2*n;i++){
sz[i]=0;
}
for(int i=1;i<=m;i++){
char opt;
cin>>opt;
int x,y;
scanf("%d",&x);
if(opt=='T'){
tfu[x]='T';
}
if(opt=='F'){
tfu[x]='F';
}
if(opt=='U'){
tfu[x]='U';
}
if(opt=='+'){
int y;
scanf("%d",&y);
merge(x,y);
merge(x+n,y+n);
}
if(opt=='-'){
int y;
scanf("%d",&y);
merge(y+n,x);
merge(x+n,y);
}
}
for(int i=1;i<=n;i++){
if(tfu[i]!='0'){
tfu[find(i)]=tfu[i];
}
}
int cnt=0;
for(int i=1;i<=n;i++){
if(find(i)==find(i+n)||tfu[find(i)]=='U'){
cnt+=sz[find(i)];
sz[find(i)]=0;
}
}
cout<<cnt<<endl;
}
return 0;
}