Pagini recente » Cod sursa (job #1356288) | Cod sursa (job #2521075) | Cod sursa (job #2852757) | Cod sursa (job #1004459) | Cod sursa (job #25117)
Cod sursa(job #25117)
#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];
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=0; i<=N; ++i)
v += (A[i>>4] & (1<<(i&15))) != 0;
return v;
}
long ala(multime A) {
long i;
for ( i=0; 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] = 65535;
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);
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);
}
}
// debug(G,' ');debug(U,'\n');
freopen(FOUT, "w", stdout);
long cU = cardinal(U);
long cG = cardinal(G);
if ( (cU==1) ^ (cG==1) ) {
if ( cU==1 )
printf("%ld\n",ala(U));
else
printf("%ld\n", ala(G));
}
else
printf("0\n");
fclose(stdout);
return 0;
}