Cod sursa(job #25165)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 4 martie 2007 11:11:18
Problema Balanta Scor 100
Compilator c Status done
Runda preONI 2007, Runda 3, Clasa a 10-a Marime 2.14 kb
#include <stdio.h>
#define FIN "balanta.in"
#define FOUT "balanta.out"
#define MAX 1034

long N, M;

typedef unsigned long multime[MAX]; // codificata pe biti.
multime G, U; 
multime T[2];
long cU, cG;

void goleste() {
	long i;
	for (i=0; i<=(N>>4); ++i)
		T[0][i] = T[1][i] =  0;
}

void debug(multime A, char c) {
	long i;
	printf("{ ");
	for (i=1; i<=N; ++i)
		if (A[i>>4] & (1<<(i&15)))
			printf("%ld ",i);
	printf("}%c", c);
}

void scade() {
	long i;
	for (i=0; i<=(N>>4); ++i) {
		U[i] &= ~T[0][i];
		U[i] &= ~T[1][i];
		G[i] &= ~T[0][i];
		G[i] &= ~T[1][i];
	}
}

void intersect(multime A, multime B) {
	long i;
	for (i=0; i<=(N>>4); ++i)
		A[i] &= B[i];
}

long cardinal(multime A) {
	long i, v=0;
	for ( i=1; i<=N; ++i)
		if (A[i>>4] & (1<<(i&15))) {
			v ++ ;
//			printf("%ld ", i);
		}
	return v;
}

long ala(multime A) {
	long i;
	for ( i=1; i<=N; ++i)
		if ( A[i>>4] & (1<<(i&15)) ) 
			return i;
	return 0;
}

int main() {
	long nr, i, rez, x;
	freopen(FIN, "r", stdin);
	scanf("%ld %ld", &N, &M); 
	for (i=0; i<=(N>>4); ++i)
		U[i] = G[i] = 131071;

	while ( M-- ) {
		scanf("%ld", &nr);
		goleste();
		for (i=1; i<=2*nr; ++i) {
			scanf("%ld", &x);
			T[(i-1)/nr][ x>>4 ] |= 1 << ( x & 15 );
		}
		scanf("%ld", &rez);
		if (rez==0) {
			scade();
		}
		if (rez==1) {
			intersect(G, T[0]);
			intersect(U, T[1]);
		}
		if (rez==2) {
			intersect(G, T[1]);
			intersect(U, T[0]);
		}
/*
		debug(T[0], ' '); debug(T[1],'\n');
		debug(G, ' ');debug(U, '\n');
		printf("\n");
*/
	}
	fclose(stdin);

//	debug(G,' ');debug(U,'\n');

	cU = cardinal(U);
	cG = cardinal(G);
//	printf("%ld %ld", cU, cG);

	if ( cU > 1 || cG > 1 ) 
		for (i=1; i<=N; ++i) {
			long r = (1<<(i&15));
			if ( (G[ i>>4 ] & r) == (U[i>>4] & r ) ) {
				G[i>>4] &= 65535 - (r);
				U[i>>4] &= 65535 - (r);
				cU--; cG--;
			}
		}
//	debug(G, cG+'0');debug(U, cU+'0');

	freopen(FOUT, "w", stdout);
	if ( (cU==1) ^ (cG==1) ) {
		if ( cU==1 ) 
			printf("%ld\n",ala(U));
		else
			printf("%ld\n", ala(G));
	}
	else {
		if ( cG == cU  && cU==1 ) {
			long r = ala(U);
			if ( r==ala(G) ) 
				printf("%ld\n", r);
			else 
				printf("0\n");
		}
		else
			printf("0\n");

	}
	fclose(stdout);
	return 0;
}