Cod sursa(job #362184)

Utilizator WildComunistChristian Ceausu WildComunist Data 8 noiembrie 2009 13:07:39
Problema Balanta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream.h>
typedef int set[1025];
ifstream fin("balanta.in");
ofstream fout("balanta.out");
int n,st[1025],dr[1025];
set u,g;
int apartenenta(int x, set a){
	return a[x];
}
void intersectie(set a,set b,set c){
	c[0]=0;
	for(int i=1;i<=a[0];i++) 
		if(apartenenta(a[i],b)){
			c[0]++;
			c[c[0]]=a[i];
		}
}
void copy(set d,set s){
	for(int i=0;i<=s[0];i++) d[i]=s[i]; 
}
void dif(set a,set b,set c){
	c[0]=0;
	for(int i=1;i<=a[0];i++) if(!apartenenta(a[i],b)) {
		c[0]++;
		c[c[0]]=a[i];
	}
}
int main(){
	fin>>n;
	int i,j,k,r,m,a[1025];
	set t;
	for(i=1;i<=n;i++)
		u[i]=g[i]=i;
	u[0]=g[0]=n;
	fin>>m;
	for(i=1;i<=m;i++){
		fin>>k;
		for(j=1;j<=n;j++) st[j]=dr[j]=0;
		for(j=1;j<=2*k;j++) fin>>a[j];
		fin>>r;
		for(j=1;j<=k;j++) st[a[j]]=1;
		for(j=k+1;j<=k*2;j++) dr[a[j]]=1;
		if(r==0) {
			dif(u,st,t);
			copy(u,t);
			dif(u,dr,t);
			copy(u,t);
			dif(g,st,t);
			copy(g,t);
			dif(g,dr,t);
			copy(g,t);
		}
		else 
			if(r==1){
				intersectie(g,st,t);
				copy(g,t);
				intersectie(u,dr,t);
				copy(u,t);
			}
		    else {
				intersectie(u,st,t);
				copy(u,t);
				intersectie(g,dr,t);
				copy(g,t);
			}
	}
if(u[0]==1&&g[0]==0) fout<<u[1];
else if(g[0]==1&&u[0]==0) fout<<g[1];
else fout<<0;
return 0;
}