Cod sursa(job #358676)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 24 octombrie 2009 08:25:39
Problema Balanta Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#include<stdlib.h>

#define NM 1025
#define LSIR NM*4

typedef int set[NM];

int apartine(int x,set a){
int i=1,j=a[0],mij;
while(i<=j){
	mij=(i+j)/2;
	if(a[mij]==x) return 1;
	else
		if(x>a[mij]) i=mij+1;
		else j=mij-1;
	}
return 0;
}

void intersectie(set a,set b,set c){
int i;
c[0]=0;
for(i=1;i<=a[0];++i)
	if(apartine(a[i],b)) c[0]++,c[c[0]]=a[i];
}

void copy(set src,set dest){
int i;
for(i=0;i<=src[0];++i) dest[i]=src[i];
}

void dif(set a,set b,set c){
int i;c[0]=0;
for(i=1;i<=a[0];++i)
	if(!apartine(a[i],b)) c[0]++,c[c[0]]=a[i];
}

int main(){
freopen("balanta.in","r",stdin);
freopen("balanta.out","w",stdout);
int i,k,s;
int n,m,l=0,h=0,mu,mg;
char sir[LSIR],*p;
mu=mg=0;
scanf("%d%d\n",&n,&m);
set st,dr,u,g,a;
for(i=1;i<=n;++i) u[i]=g[i]=i;
u[0]=g[0]=n;
while(m--){
	fgets(sir,LSIR,stdin); p=sir;
	k=atoi(p);
	while(*p!=32) p++;p++;
	for(i=1;i<=k;++i){
		st[i]=atoi(p);
		while(*p!=32) p++;p++;
		}
	for(i=1;i<=k;++i){
		dr[i]=atoi(p);
		while(*p!=32) p++;p++;
		}
	st[0]=dr[0]=k;
	s=atoi(p);
	if(!s){
		dif(u,st,a);copy(a,u);
		dif(u,dr,a);copy(a,u);
		dif(g,st,a);copy(a,g);
		dif(g,dr,a);copy(a,g);
		continue;
		}
	if(s==1){
		intersectie(g,st,a);
		copy(a,g);
		intersectie(u,dr,a);
		copy(a,u);
		}
	else{
		intersectie(u,st,a);
		copy(a,u);
		intersectie(g,dr,a);
		copy(a,g);
		}
	}
l=u[0],h=g[0],mu=u[1],mg=g[1];
if(l==1&&h==0) printf("%d",mu);
	else
		if(l==0&&h==1) printf("%d",mg);
		else printf("0");
return 0;
}