Cod sursa(job #1119671)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 24 februarie 2014 19:19:59
Problema Hashuri Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.79 kb
#include <stdio.h>
#define N_MAX 1000000
#define modP 700001
#define mulQ 200003
typedef char bool;

int list[ N_MAX + 1 ], next[ N_MAX + 1 ], beg[ modP ], end[ modP ];
int sp;

inline int hash( int x ) {
    return ( x * mulQ ) % modP;
}

void add( int x ) {
    int h = hash( x );
    if( beg[ h ] ) {
        int curr = beg[ h ];
        while( curr && list[ curr ] != x ) {
            curr = next[ curr ];
        }
        if( curr == 0 ) {
            list[ ++ sp ] = x;
            next[ end[ h ] ] = sp;
            end[ h ] = sp;
        }
    } else {
        list[ ++ sp ] = x;
        beg[ h ] = end[ h ] = sp;
    }
}

void rem( int x ) {
    int h = hash( x );
    if( beg[ h ] ) {
        int curr = beg[ h ];
        if( list[ curr ] == x ) {
            beg[ h ] = next[ curr ];
        } else {
            while( curr && list[ next[ curr ] ] != x ) {
                curr = next[ curr ];
            }
            if( curr ) {
                next[ curr ] = next[ next[ curr ] ];
            }
        }
    }
}

bool ask( int x ) {
    int h = hash( x );
    if( beg[ h ] ) {
        int curr = beg[ h ];
        while( curr && list[ curr ] != x ) {
            curr = next[ curr ];
        }
        if( curr ) {
            return 1;
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

int main( ) {
    FILE * fin, * fout;
    fin = fopen( "hashuri.in", "r" );
    fout = fopen( "hashuri.out", "w" );

    int N;
    fscanf( fin, "%d", &N );

    int i;
    for( i = 1; i <= N; i ++ ) {
        int tp, x;
        fscanf( fin, "%d%d", &tp, &x );
        if( tp == 1 ) {
            add( x );
        } else if( tp == 2 ) {
            rem( x );
        } else {
            fprintf( fout, "%d\n", ask( x ) );
        }
    }

    fclose( fin );
    fclose( fout );
}