Cod sursa(job #1248344)

Utilizator xtreme77Patrick Sava xtreme77 Data 24 octombrie 2014 22:43:58
Problema Lazy Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
/*
 * Code by Spiromanul
 */


#include <fstream>
#include <algorithm>
#include <vector>

const char IN [ ] = "lazy.in" ;
const char OUT [ ] = "lazy.out" ;
const long long  MAX = 200014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

long long  tata [ MAX ] , rang [ MAX ] ;
char sir [ MAX * 10 ] ;
int cur = 0 ;

struct nationala {
    long long  a ; long long  b ;
    long long  c1 , c2 ;
    long long  poz ;
    void sett ( long long  aaa , long long  bbb , long long  ccc , long long  ddd , long long  eee )
    {
        a = aaa ;
        b = bbb ;
        c1 = ccc ;
        c2 = ddd ;
        poz = eee ;
    }
};

nationala q [ MAX ] ;

bool cmp ( nationala a , nationala b )
{
    if ( a.c1 == b.c1 )
        return a.c2 > b.c2 ;
    return a.c1 < b.c1 ;
}

long long  stramos ( long long  nod )
{
    long long  R = nod ;
    for ( ; tata [ R ] != R ; R = tata [ R ] ) ;
    while ( nod != tata [ nod ] )
    {
        long long  aux = tata [ nod ] ;
        tata [ nod ] = R ;
        nod = aux ;
    }
    return R ;
}
void uneste ( long long  a , long long  b )
{
    if ( rang [ a ] < rang [ b ] )
        swap ( a , b ) ;
    tata [ b ] = a ;
    rang [ a ] += rang [ b ] ;
}

long long urm ( )
{
    long long sol = 0 ;
    while ( sir [ cur ] and (sir [ cur ] <'0' or sir [ cur ] > '9') ) ++ cur ;
    for ( ; sir [ cur ] >= '0' and sir [ cur ] <= '9' ; ++cur )
        sol = sol * 10 + sir [ cur ] - '0' ;
    return sol ;
}

int main(              )
{
    long long  n , m ;
    fin.getline ( sir , MAX * 10 , EOF ) ;
    n = urm ( ) ;
    m = urm ( ) ;
    for ( long long  i = 1 ; i <= n ; ++ i )
    {
        tata [ i ] = i ;
        rang [ i ] = 1 ;
    }
    for ( long long  i = 1 ; i <= m ; ++ i )
    {
        long long  a , b , c , d ;
        a = urm ( ) ;
        b = urm ( ) ;
        c = urm ( ) ;
        d = urm ( ) ;
        q [ i ].sett ( a , b , c , d , i ) ;
    }
    sort ( q + 1 , q + m + 1 , cmp ) ;
    for ( long long  i = 1 ; i <= m ; ++ i )
        if ( stramos ( q [ i ].a ) != stramos ( q [ i ].b ) ){
            uneste ( stramos ( q [ i ].a ) , stramos ( q [ i ].b ) ) ;
            fout << q [ i ].poz << '\n' ;
        }
    return 0;
}