Cod sursa(job #25058)

Utilizator sandyxpSanduleac Dan sandyxp Data 4 martie 2007 10:20:19
Problema Balanta Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasa a 10-a Marime 1.77 kb
#include <cstdio>
#include <cstring>

#define FIN "balanta.in"
#define FOUT "balanta.out"
#define MAXN 1025

int V[2][MAXN], // apartin monedele printre care daca e cea naspa, atunci e mai grea/usoara;
    no[2]={0,0}, n, m;

void put(int where, int who)
{
    int i;
    for (i=0; where; where >>= 1, ++i)
        if (where & 1) {
            if (!V[i][who]) ++no[i];
            V[i][who] = 1;
        }
}

void rem(int where, int who)
{
    int i;
    for (i=0; where; where >>= 1, ++i)
        if (where & 1) {
            if (V[i][who]) --no[i];
            V[i][who] = 0;
        }
}

void rezolvare()
{
    int i, j, nr, r, A[2][MAXN];

    freopen(FIN, "r", stdin);
    freopen(FOUT,"w",stdout);
    scanf("%d %d", &n, &m);
    for (i=1; i<=n; ++i)  put(1, i); // le bagam initial pe toate la grele

    for (i=0; i<m; ++i)
    {
        scanf("%d", &nr);
        for (j=0; j<nr; ++j) scanf("%d", &A[0][j]);
        for (j=0; j<nr; ++j) scanf("%d", &A[1][j]);
        scanf("%d", &r);
        if (r == 0)
            for (j=0; j<nr*2; ++j) rem(3, A[0][j]);  // 1-G, 10-U
        else {
            for (j=0; j<nr; ++j) { put(1<<(r-1), A[0][j]); rem(1<<(r&1), A[0][j]); }
            for (j=0; j<nr; ++j) { put(1<<(r&1), A[1][j]); rem(1<<(r-1), A[1][j]); }
        }
        //for (j=1; j<=n; ++j) if (V[0][j]) fprintf(stderr, "%d ", j); fprintf(stderr,"\n");
        //for (j=1; j<=n; ++j) if (V[1][j]) fprintf(stderr, "%d ", j); fprintf(stderr,"\n");
    }
    if (no[0] != no[1])
    {
        if (no[0] == 1)
            for (i=1; i<=n; ++i) if (V[0][i]) { printf("%d\n", i); return; } // si e mai grea
        if (no[1] == 1)
            for (i=1; i<=n; ++i) if (V[1][i]) { printf("%d\n", i); return; } // si e mai usoara
    }
    printf("0\n");
}

int main()
{
    rezolvare();
    return 0;
}