Cod sursa(job #1865453)

Utilizator Coroian_DavidCoroian David Coroian_David Data 1 februarie 2017 19:25:03
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int HASH = (1 << 20) - 1;

int h(int x)
{
    return (x & HASH);
}

int lst[1050000];
int urm[2000001];
int val[2000001];
int nr;
int n;

void add(int a, int b)
{
    ///nr = *p;
    ///urm = p -> urm
    ///val = p -> nr

    int p = lst[a], nrul;

    while(p != 0)
    {
        nrul = val[p];

        if(nrul == b)
            return;


        p = urm[p];
    }

    val[++ nr] = b;

    urm[nr] = lst[a];

    lst[a] = nr;
}

void dilit(int a, int b)
{
    int p = lst[a], nr;

    while(p != 0)
    {
        nr = val[p];

        if(nr == b)
        {
            val[p] = -1;

            return;
        }

        p = urm[p];
    }
}

bool cauta(int a, int b)
{
    int p = lst[a], nr;

    while(p != 0)
    {
        nr = val[p];

        if(nr == b)
        {
            return 1;
        }

        p = urm[p];
    }

    return 0;
}

void readFile()
{
    f = fopen("hashuri.in", "r");
    g = fopen("hashuri.out", "w");

    fscanf(f, "%d", &n);

    int i, op, nr;
    int found;
    for(i = 1; i <= n; i ++)
    {
        fscanf(f, "%d%d", &op, &nr);

        if(op == 1)
        {
            add(h(nr), nr);
        }

        if(op == 2)
        {
            dilit(h(nr), nr);
        }

        if(op == 3)
        {
            found = cauta(h(nr), nr);

            if(found == 1)
                fprintf(g, "1\n");

            else
                fprintf(g, "0\n");
        }
    }

    fclose(f);
    fclose(g);
}

int main()
{
    readFile();

    return 0;
}