Cod sursa(job #65377)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 9 iunie 2007 10:39:40
Problema Balanta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <string.h>

#define max 1025

int g[max];
int u[max];
int n,m;
int a[max],b[max];
int eu,eg;

void init()
{
	memset(g,0,sizeof(g));
	memset(u,0,sizeof(u));
}
void readdata()
{
	scanf("%d %d\n",&n,&m);
	for(int i=1;i<=n;i++) g[i]=u[i]=1;
}
void intersect(int r)
{
	if(r==1)
	{
		for(int i=1;i<=n;++i)
		{
			if(!(a[i] && g[i])) 
			{
				if(g[i]) eg--;
				g[i]=0;
			}
			if(!(b[i] && u[i])) 
			{
				if(u[i]) eu--;
				u[i]=0;
			}
		}
	}
	else
	{
		for(int i=1;i<=n;++i)
		{
			if(!(a[i] && u[i])) 
			{
				if(u[i]) eu--;
				u[i]=0;
			}
			if(!(b[i] && g[i])) 
			{	
				if(g[i]) eg--;
				g[i]=0;
			}

		}
	}
}
void difference()
{
	for(int i=1;i<=n;++i) 
	{
		if(a[i] || b[i]) 
		{
			if(g[i]) eg--;
			if(u[i]) eu--;
			u[i]=g[i]=0;			
		}
	}
}
int main()
{
	freopen("balanta.in","r",stdin);
	freopen("balanta.out","w",stdout);
	init();
	readdata();
	eu=eg=n;
	int e,x,r;
	int i,j;
	for(i=0;i<m;++i)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		
		scanf("%d",&e);
		for(j=0;j<e;++j)
		{
			scanf("%d",&x);
			a[x]=1;
		}
		for(j=0;j<e;++j)
		{
			scanf("%d",&x);
			b[x]=1;
		}
		scanf("%d",&r);
		if(r==0) difference();				
		else intersect(r);		
	}
	if(eu==0 && eg==1) for(i=1;i<=n;++i) if(g[i]) { printf("%d ",i); break; }
	if(eu==1 && eg==0) for(i=1;i<=n;++i) if(u[i]) { printf("%d ",i); break; }
	if(eu && eg) printf("0");
	return 0;
}