# Parity Game（并查集）

The first line of input file PARITY.IN contains one number, which is the length of the sequence of zeroes and ones. This length is less or equal to 1000000000. In the second line, there is one positive integer which is the number of questions asked and answers to them. The number of questions and answers is less or equal to 5000. The remaining lines specify questions and answers. Each line contains one question and the answer to this question: two integers (the position of the first and
last digit in the chosen subsequence) and one word which is either `even' or`odd’ (the answer, i.e. the parity of the number of ones in the chosen subsequence, where `even' means an even number of ones and`odd’ means an odd number).

There is only one line in output file PARITY.OUT containing one integer X. Number X says that there exists a sequence of zeroes and ones satisfying first X parity conditions, but there exists none satisfying X+1 conditions. If there exists a sequence of zeroes and ones satisfying all the given conditions, then number X should be the number of all the questions asked.

10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd

3

``````#include iostream
#include cstring
#include algorithm
#include map
#include vector
using namespace std;

int parent;
int rel; /* relation to the parent */
mapint, int pos2idx;
vectorint pos;
int length;
int N; /* number of answers */
int M; /* number of indexs */
int l, r;
bool v;
char buf;

int getroot(int cur)
{
if (cur == parent[cur])
return cur;
int root = getroot(parent[cur]);
rel[cur] = rel[parent[cur]] ^ rel[cur];
parent[cur] = root;
return root;
}

/**
* @return -1 if fail, 0 if normal
*/
int merge(int i, int j, bool r_i_j)
{
int root_i = getroot(i);
int root_j = getroot(j);
if (root_i == root_j) {
/* check */
if (r_i_j != (rel[i] ^ rel[j]))
return -1;
}
else {
/* merge */
parent[root_i] = root_j; /* Attention: not parent[i] = j; !!! */
rel[root_i] = rel[i] ^ rel[j] ^ r_i_j;
}
return 0;
}

int main()
{
cin  length  N;
for (int i = 0; i  N; ++i) {
scanf("%d %d %s", l[i], r[i], buf);
++r[i];
v[i] = buf == 'o';
pos.push_back(l[i]);
pos.push_back(r[i]);
}
sort(pos.begin(), pos.end());

auto it = unique(pos.begin(), pos.end());
pos.erase(it, pos.end());

M = pos.size();
for (int i = 0; i  M; ++i) {
pos2idx[pos[i]] = i;
parent[i] = i;
}
int i;
for (i = 0; i  N; ++i) {
if (merge(pos2idx[l[i]], pos2idx[r[i]], v[i]) == -1)
break;
}
printf("%d\n", i);

system("pause");
return 0;
}
``````