Cod sursa(job #26753)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 5 martie 2007 21:00:35
Problema Balanta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <bitset>

using namespace std;

#define MAXN 1024

int N, M;
bitset<MAXN> high, low, m1, m2;

int main()
{
	freopen("balanta.in", "rt", stdin);
	freopen("balanta.out", "wt", stdout);

	scanf("%d %d", &N, &M);
	for (int i = 0; i < N; i++)
		high[i] = 1, low[i] = 1;

	for (; M; M--)
	{
		int Nm; m1.reset(); m2.reset();
		scanf("%d", &Nm);

		for (int i = 0; i < Nm; i++)
		{
			int k;
			scanf("%d", &k); m1[k - 1] = 1;
		}

		for (int i = 0; i < Nm; i++)
		{
			int k;
			scanf("%d", &k); m2[k - 1] = 1;
		}

		int type;
		scanf("%d", &type);

		if (type == 0)			//monezile din ambele multimi nu sunt false
			high &= ~m1 & ~m2,
			low &= ~m1 & ~m2;

		if (type == 1)			//monezile din prima multime au potentialul de a fi moneda falsa mai grea
						//in timp ce celelalte au potentialul de a fi moneda falsa mai usoara
			high &= m2,
			low &= m1;

		if (type == 2)			//caz simetric celui de mai sus
			high &= m1,
			low &= m2;
	}

	if (high.count() == 1 && low.none())
	{
		int rez;
		for (rez = 0; !high[rez]; rez++);
		printf("%d\n", rez + 1);
		return 0;
	}
	if (low.count() == 1 && high.none())
	{
		int rez;
		for (rez = 0; !low[rez]; rez++);
		printf("%d\n", rez + 1);
		return 0;
	}

	printf("0\n");

	return 0;
}