Pagini recente »
pregatire_lot_juniori_runda2
|
Borderou de evaluare (job #366953)
|
Monitorul de evaluare
|
Istoria paginii runda/2014-12-16-concurs-5
|
Cod sursă (job #119294)
Cod sursă (job
#119294)
#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 ++ ;
for( int j = 0 ; j < cline ; j ++ )
printf ( "%d" , get( j ) ) ;
printf( "\n" ) ;
}
///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 ;
}