Cod sursă (job #119298)

Utilizator avatar dummy contdezactivat dummy IP ascuns
Problemă Beculețe (clasele 9-10) Compilator cpp | 2,76 kb
Rundă Tema 15 clasele 9-10 2014/15 Status evaluat
Dată 18 feb. 2015 00:09:19 Scor 75
#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 ) ;
    lg = ( 1 << lg ) ;
    number = lg ;
    number >>= 5 ;
    Smerenie = ~Smerenie ;

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

    i = 0 ;
    cline = lg ;
    while ( cline < lines )
          {
           while( Damage[ i ].l == cline )
              {
                settings( Damage[ i ].c - 1 , Damage[ i ].v ) ;
                i ++ ;
              }
           xoring ( cline ) ;
           cline ++ ;
          }
    ///Daca mai raman...Doamne ajuta!
    while( i < damaged )
         {
           settings( Damage[ i ].c - 1 , Damage[ i ].v ) ;
           i ++ ;
         }
    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 ;

}