Pagini recente »
Istoria paginii runda/s20_tema2_10/clasament
|
Istoria paginii utilizator/serban_ilinca_5b
|
Istoria paginii runda/cex_gj11_12_2
|
Monitorul de evaluare
|
Cod sursă (job #119230)
Cod sursă (job
#119230)
#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 ) ;
}
///functia Divide pentru Qsort
int Divide( int p , int q )
{
int st = p ;
int dr = q ;
int alfa = Damage[ p ].l ;
while ( st < dr )
{
while ( st < dr && Damage[ dr ].l >= alfa )
dr -- ;
Damage[ st ].l = Damage[ dr ].l ;
while ( st < dr && Damage[ st ].l <= alfa )
st ++ ;
Damage[ dr ].l = Damage[ st ].l ;
}
Damage[ st ].l = alfa ;
return st ;
}
///Qsort
void Qsort( int p , int q )
{
int m = Divide( p , q ) ;
if( m - 1 > p )
Qsort( p , m - 1 ) ;
if( m + 1 < q )
Qsort( m + 1 , q ) ;
}
///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 ) ;
Qsort( 0 , damaged - 1 ) ;
/*for( i = 0 ; i < damaged ; i ++ )
printf( "da%d%d%d\n" , 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 ;
cline = lg ;
aux_line = lg + 1 ;
while ( cline <= lines && aux_line <= lines )
{
while( Damage[ i ].l == cline )
{
settings( Damage[ i ].c - 1 , Damage[ i ].v ) ;
i ++ ;
}
xoring ( cline ) ;
cline ++ ;
aux_line ++ ;
}
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 ;
}