Cod sursă (job #474233)

Utilizator avatar andra_alazaroaie Andra Alazaroaie andra_alazaroaie IP ascuns
Problemă Beculețe (clasele 9-10) Compilator c | 0,98 kb
Rundă Arhiva de probleme Status evaluat
Dată 24 apr. 2019 23:45:14 Scor 100
#include <stdio.h>
#define MAX 50000
FILE *fin,*fout;
unsigned v[MAX/32+2];

int getBit(int poz){
  unsigned x=v[poz>>5]; //poz/32
  int y=poz&((1<<5)-1); //poz%32
  return (x>>y)&1;
}

void setBit(int poz, int b, int i){
  int x=poz>>5;
  int y=poz&((1<<5)-1);//poz%32
  v[x]&=(~(1<<y));     //setez bitul y pe 0
  v[x]|=(b<<y);        //ii dau bitului y valoarea b
}

int main(){
  fin=fopen("beculete.in","r");
  fout=fopen("beculete.out","w");
  int n,d,l,c,bit,i,j,a,b,aux;
  unsigned mask;

  fscanf(fin,"%d%d",&n,&d);
  if(d)
    fscanf(fin,"%d%d%d",&l,&c,&bit);
  j=v[0]=1;
  for(i=2; i<=n; i++){
    b=0;
    for(a=0; a*32<=i; a++){
      aux=v[a]>>31;
      mask=(v[a]<<1)+b;
      v[a]^=mask;
      b=aux&1;
    }
    v[a]=aux;
    while(j<=d && l==i){
      setBit(c-1,bit,i);
      fscanf(fin,"%d%d%d",&l,&c,&bit);
      j++;
    }
  }
  for(i=0; i<n; i++)
    fprintf(fout,"%d ",getBit(i));
  fclose(fin);
  fclose(fout);
  return 0;
}