Cod sursa(job #811302)

Utilizator Detrol2kGuianu Leon Detrol2k Data 11 noiembrie 2012 21:15:32
Problema Balanta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
using namespace std;

void remove(int k, int x[], int y[])
{
	for(int i=1; i<=k; i++)
		if(x[y[i]])		
			x[y[i]] = 0, x[0]--;
}

void intersect(int n, int k, int x[], int y[])
{
	int i, aux[2000];
	
	for(i=0; i<=n; i++)
		aux[i] = x[i], x[i] = 0;
		
	for(i=1; i<=k; i++)
		if(aux[y[i]])
			x[y[i]] = y[i], x[0]++;
}

int print(int n, int x[])
{
	for(int i=1; i<=n; i++)
		if(x[i])
			return x[i];
			
	return 0;
}

int main()
{
	ifstream f("balanta.in");
	ofstream g("balanta.out");
	
	int n, m, k, r, i, j, a[2000], b[2000], h[2000], l[2000];
	h[0] = l[0] = 0;
	
	//Read
	f>>n>>m;
	for(i=1; i<=n; i++)
	{
		h[i] = i, h[0]++;//multimea monedelor grele
		l[i] = i, l[0]++;//multimea mondelor usoare
	}
	for(i=1; i<=m; i++)
	{	
		f>>k;
		for(j=1; j<=k; j++)
			f>>a[j]; //talerul stang
		for(j=1; j<=k; j++)
			f>>b[j]; //talerul drept
		f>>r; //starea balantei
		
		//Compute
		if(r == 0) //balanta e in echilibru
		{
			remove(k,h,a); remove(k,h,b);
			remove(k,l,a); remove(k,l,b);
		}
		if(r == 1) //balanta se inclina in stanga
		{
			intersect(n,k,h,a);
			intersect(n,k,l,b);
		}
		if(r == 2) //balanta se inclina in dreapta
		{
			intersect(n,k,h,b);
			intersect(n,k,l,a);
		}
	}
	
	//Print
	if(h[0]==1 && l[0]==0)
	{
		g<<print(n,h);
		return 0;
	}
	if(h[0]==0 && l[0]==1)
	{
		g<<print(n,l);
		return 0;
	}
	g<<0;
}