Cod sursa(job #239358)

Utilizator DastasIonescu Vlad Dastas Data 4 ianuarie 2009 17:37:29
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>

const int maxp = 1 << 20;

FILE *in = fopen("hashuri.in","r"), *out = fopen("hashuri.out","w");

struct hash
{
    int val;

    hash *next;
};

int n;
hash *h[maxp];

void add(int val)
{
    int v = val & (maxp - 1);

    hash *t = new hash;
    t->val = val;
    t->next = h[v];
    h[v] = t;
}

int find(int val)
{
    int v = val & (maxp - 1);

    for ( hash *t = h[v]; t; t = t->next )
        if ( t->val == val )
            return 1;

    return 0;
}

void del(int val)
{
    int v = val & (maxp - 1);

    hash *t = new hash;
    if ( h[v]->val == v )
    {
        t = h[v];
        h[v] = h[v]->next;
        delete t; return;
    }

    for ( t = h[v]; t->next; t = t->next )
        if ( t->next->val == val )
        {
            hash *q = t->next;
            t->next = t->next->next;
            delete q; return;
        }
}

int main()
{
    fscanf(in, "%d", &n);

    int op, x;
    for ( int i = 1; i <= n; ++i )
    {
        fscanf(in, "%d %d", &op, &x);

        if ( op == 1 )
        {
            if ( !find(x) )
                add(x);
        }
        else if ( op == 2 )
        {
            if ( find(x) )
                del(x);
        }
        else
            fprintf(out, "%d\n", find(x));
    }

    return 0;
}