2979: 食物链
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX = 5e4 + 7;
int pre[MAX * 3];
int n, m;
int findx(int x)
{
return x == pre[x] ? x : pre[x] = findx(pre[x]);
}
void join(int x, int y)
{
int a = findx(x);
int b = findx(y);
if(a != b)
pre[a] = b;
}
void init()
{
for(int i = 0; i < MAX * 3; i++)
pre[i] = i;
}
bool same(int x, int y)
{
return findx(x) == findx(y);
}
int main()
{
ios::sync_with_stdio(false);
while(cin >> n >> m)
{
int ans = 0;
init();
for(int i = 0, x, y, z ; i < m; i++)
{
cin >> x >> y >> z;
y--;
z--;
if(y < 0 || n <= y || z < 0 || n <= z)
{
ans++;
continue;
}
if(x == 1)
{
if(same(y, z + n) || same(y, z + 2 * n))
ans++;
else
{
join(y, z);
join(y + n, z + n);
join(y + 2 * n, z + 2 * n);
}
}
else
{
if(same(y, z) || same(y, z + 2 * n))
ans++;
else
{
join(y, z + n);
join(y + n, z + 2 * n);
join(y + 2 * n, z);
}
}
}
cout << ans << endl;
}
return 0;
}