Cod sursa(job #1791821)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 29 octombrie 2016 19:09:14
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#include <ctype.h>
#define buff_size 1<<17
#define nmax 100000

int v[nmax+1];
int pozr, pozw;
char bufferr[buff_size], bufferw[buff_size];
FILE *fin, *fout;

char getch(){
    if( pozr == buff_size ){
        fread( bufferr, buff_size, 1, fin );
        pozr = 0;
    }
    return bufferr[ pozr++ ];
}

int scano(){
    int nr = 0;
    char ch = getch();
    while( isdigit(ch) == 0 )
        ch = getch();
    while( isdigit(ch) != 0 ){
        nr = nr * 10 + ch - '0';
        ch = getch();
    }
    return nr;
}

void putch( char ch ){
    bufferw[ pozw++ ] = ch;
    if( pozw == buff_size ){
        fwrite( bufferw, buff_size, 1, fout );
        pozw = 0;
    }
}

void printo( int ver ){
    if( ver==0 ){
        putch( 'N' );
        putch( 'U' );
        putch( '\n' );
    }
    else{
        putch( 'D' );
        putch( 'A' );
        putch( '\n' );
    }
}

void generare( int n ){
    int i;
    for( i=0; i<n; i++ )
        v[i] = i;
}

int find( int nr ){
    if( v[nr]!=nr )
        v[nr] = find( v[nr] );
    return v[nr];
}

void unite( int a, int b ){
    int pa, pb;

    pa = find( a );
    pb = find( b );

    if( pa!=pb ){
        v[pa] = pb;
    }
}

int main()
{
    int n, m, i, ver, a, b;
    fin = fopen( "disjoint.in", "r" );
    fout = fopen( "disjoint.out", "w" );
    n = scano(); m = scano();
    generare( n );
    for( i=0; i<m; i++ ){
        ver = scano(); a = scano(); b = scano();
        if( ver==1 )
            unite( a, b );
        else{
            if( find(a) == find(b) )
                printo( 1 );
            else
                printo( 0 );
        }
    }
    if( pozw>0 )
        fwrite( bufferw, pozw, 1, fout );
    fclose( fin );
    fclose( fout );
    return 0;
}