Cod sursa(job #616790)

Utilizator vlad2901Vlad Berindei vlad2901 Data 13 octombrie 2011 13:29:02
Problema Balanta Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.79 kb
#include <cstdio>
#define MAXN 1024

int c[MAXN];
int b[MAXN];
int n, m;

/*
c[i] = 0 daca nu se stie nimic despre moneda i
c[i] = 1 daca moneda i a facut parte dintr-un grup 'mai greu'
c[i] = -1 daca moneda i a facut parte dintr-un grup 'mai usor'
c[i] = 2 daca moneda i sigur nu e cea cautata
*/

int main()
{
    int i, j, g = 0, u = 0, s = 0, nr, r;
    freopen("balanta.in", "r", stdin);
    freopen("balanta.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for(i=0;i<m;++i)
    {
        scanf("%d", &nr);
        for(j=0;j<2*nr;++j)
        {
            scanf("%d", &b[j]);
        }

        scanf("%d", &r);

        switch(r)
        {
            case 0:
                for(j=0;j<nr;++j)
                {
                    c[b[j]] = 2;
                }
                for(j=nr;j<2*nr;++j)
                {
                    c[b[j]] = 2;
                }
                break;
            case 1:
                for(j=0;j<nr;++j)
                {
                    if(c[b[j]] == -1 || c[b[j]] == 2)
                        c[b[j]] = 2;
                    else
                        c[b[j]] = 1;
                }
                for(j=nr;j<2*nr;++j)
                {
                    if(c[b[j]] == 1  || c[b[j]] == 2)
                        c[b[j]] = 2;
                    else
                        c[b[j]] = -1;
                }
                break;
            case 2:
                for(j=0;j<nr;++j)
                {
                    if(c[b[j]] == 1  || c[b[j]] == 2)
                        c[b[j]] = 2;
                    else
                        c[b[j]] = -1;
                }
                for(j=nr;j<2*nr;++j)
                {
                    if(c[b[j]] == -1  || c[b[j]] == 2)
                        c[b[j]] = 2;
                    else
                        c[b[j]] = 1;
                }
                break;
        }
        u = g = s = 0;
        for(j=0;j<2*nr;++j)
        {

            switch(c[b[j]])
            {
                case -1:
                    ++u; //usoare
                    break;
                case 1:
                    ++g; //grele
                    break;
                case 2:
                    ++s;
                    break;
            }
        }


        if(u == 1 && g != 1)
        {
            for(j=0;j<2*nr;++j)
            {
                if(c[b[j]] == -1)
                {
                    printf("%d\n", b[j]);
                    return 0;
                }
            }
        }

        if(g == 1 && u != 1)
        {
            for(j=0;j<2*nr;++j)
            {
                if(c[b[j]] == 1)
                {
                    printf("%d\n", b[j]);
                    return 0;
                }
            }
        }
    }

    s = g = u = 0;

    for(i=1;i<=n;++i)
    {
        switch(c[i])
        {
            case -1:
                ++u;
                break;
            case 1:
                ++g;
                break;
            case 2:
                ++s;
                break;
        }
    }

    if(s == n-1)
    {
        for(i=1;i<=n;++i)
        {
            if(c[i] != 2)
            {
                printf("%d\n", i);
                return 0;
            }
        }
    }

    if(u == 1 && g != 1)
    {
        for(i=1;i<=n;++i)
        {
            if(c[i] == -1)
            {
                printf("%d\n", i);
                return 0;
            }
        }
    }

    if(g == 1 && u != 1)
    {
        for(i=1;i<=n;++i)
        {
            if(c[i] == 1)
            {
                printf("%d\n", i);
                return 0;
            }
        }
    }

    printf("0\n");
    return 0;
}