Cod sursă (job #119260)

Utilizator avatar Claudiu Dan Claudiu Claudiu IP ascuns
Problemă Beculețe (clasele 9-10) Compilator cpp | 1,79 kb
Rundă Tema 15 clasele 9-10 2014/15 Status evaluat
Dată 17 feb. 2015 22:50:37 Scor 63
#include <stdio.h>

using namespace std;

const unsigned short int N=50000/63 + 1;
const unsigned short int D=10001;
unsigned long long a[N];
unsigned short int na;
unsigned short int x[D],y[D],v[D];

int main()
{
    FILE *in=fopen("beculete.in","r");
    FILE *out=fopen("beculete.out","w");

    unsigned short int n,d,i,j,p,k;
    unsigned long long bit1,bit2;

    fscanf(in,"%hu%hu",&n,&d);
    for(i=0;i<d;i++)
    {
        fscanf(in,"%hu%hu%hu",&x[i],&y[i],&v[i]);
        x[i]--;
        y[i]--;
    }

    na=1;
    a[0]=1LLU;
    p=0;
    for(i=1;i<n;i++)
    {
        bit1=bit2=0LLU;
        //formeaza linia i (liniile incep de la 0) si apoi verifica bitii
        for(j=0;j<na;j++)
        {
            bit2=(a[j]&(1LLU<<63))>>63;
            a[j]^=a[j]<<1;
            a[j]^=bit1;
            bit1=bit2;
            while(p<d && x[p]==i && y[p]>=64*j && y[p]<64*(j+1))
            {
                a[j]&=~(1LLU<<(y[p]-64*j));
                if(v[p]) a[j]+=1LLU<<(y[p]-64*j);
                p++;
            }
        }
        if(bit1)
        {
            a[na]=1LLU;
            if(p<d && x[p]==i && y[p]==64*na && v[p]==0)
            {
                a[na]=0LLU;
                p++;
            }
            na++;
        }

        //afiseaza
        /*for(j=0;j<na;j++)
        {
            for(k=0;k<64;k++)
            {
                if(a[j]&(1LLU<<k)) printf("1");
                else printf("0");
            }
        }
        printf("\n");*/
    }

    i=0;
    j=0;
    while(i<n)
    {
        k=0;
        while(i<n && k<64)
        {
            fprintf(out,"%d",(a[j]&(1LLU<<k))>>k);
            if(i<n-1) fprintf(out," ");
            k++;
            i++;
        }
        j++;
    }
    return 0;
}