Cod sursă (job #119258)

Utilizator avatar dummy contdezactivat dummy IP ascuns
Problemă Beculețe (clasele 9-10) Compilator cpp | 2,62 kb
Rundă Tema 15 clasele 9-10 2014/15 Status evaluat
Dată 17 feb. 2015 22:47:27 Scor 81
#include <cstdio>
#include <cmath>
#define Dragoste 1563
#define Nadejde  10000
#define Credinta 31

using namespace std ;

typedef struct {
        int l , c , v ;
}       Eroare ;

Eroare Damage[ Nadejde ] ;
unsigned long int lb[ Dragoste ] ;///vector cu beculete ( light bulb )
int lines ;///cate  linii
int cline ;///indice de linii
int damaged ;///numar de stricate
int lg ;///logaritm
int number ;///cate de 111..111
int aux_line ;
unsigned long int Smerenie ;

void xoring( int linii )
{
    int until_here = linii >> 5 ;
    int i ;
    unsigned long int copie_long ; ///copia unui element din vector
    unsigned long int mask ; ///cream o masca
    unsigned long int long_nou ; ///prelucare din nou
    long_nou = 0 ;///artificiu
    for( i = 0 ; i <= until_here ; i ++ )
       {
         copie_long = lb[ i ] ;///copiem
         mask = lb[ i ] >> 1 ;///cream masca
         mask |= long_nou ;///facem mask & long_nou ( 0 | 1 )
         lb[ i ] ^= mask ; ///facem XOR
         long_nou = copie_long & 1 ;///long_nou % 2
         long_nou <<= 31 ;///shiftam la stanga
       }
}
///setam bitul
void settings( int poz , int v ) {
  unsigned long int mask = ~( 1 << ( 31 - ( poz & 31 ) ) );
  lb[ poz >> 5 ] = ( lb[ poz >> 5 ] & mask) ^ ( v << ( 31 - ( poz & 31 ) ) ) ;
}
///luam bitul
int get( int x )
{
    return   ( lb[ x >> 5 ] >> ( 31 - ( x & 31 ) ) & 1 ) ;
}
///int main
int main( )
{
    int i ;
    ///fisiere intrare - iesire
	freopen( "beculete.in" , "r" , stdin ) ;
	freopen( "beculete.out" , "w" , stdout ) ;

    ///citim variabile
    scanf( "%d%d" , &lines , &damaged ) ;

    for( i = 0 ; i < damaged ; i ++ )
        scanf( "%d%d%d" , &Damage[ i ].l , &Damage[ i ].c , &Damage[ i ].v ) ;
    ///simulam cei 111...1111
    lg = log2( Damage[ 0 ]. l ) ;
    number = ( 1<<lg ) ;
    number = ( number >> 5 ) ;
    Smerenie = ~Smerenie ;

    lb[ 0 ] = ( Smerenie << ( Credinta + 1 - ( 1 << lg ) + ( number << 5 ) ) ) ;
    ///E binee...Doamne ajuta!
    for( i = 1 ; i < number ; i ++ )
         lb[ i ] = ( Smerenie <<( Credinta + 1 - ( 1 << lg ) + ( number << 5 ) ) ) ;

    i = 0 ;
    lg = ( 1 << lg ) ;
    cline = lg ;
    while ( cline < lines )
       {
         while( Damage[ i ].l == cline )
              {
                settings( Damage[ i ].c - 1 , Damage[ i ].v ) ;
                i ++ ;
              }
         xoring ( cline ) ;
         cline ++ ;
       }
    for( i = 0 ; i < lines ; i ++ )
        printf ( "%d " , get( i ) ) ;

	///printf( "\nGresit-am Doamne inaintea Ta si nu sunt vrednic sa ma numesc Fiul Tau " ) ;

	return 0 ;

}