Cod sursa(job #904615)

Utilizator chimistuFMI Stirb Andrei chimistu Data 4 martie 2013 17:08:04
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
using namespace std;

ifstream f("hashuri.in");
ofstream g("hashuri.out");

int func1 (int k, int val)
{
    return val%k;
}

int func2 (int k, int val)
{
    return (val/k)%k;
}

int cauta(int val, int k, int *hash1, int *hash2)
{
        if (hash1[func1(k,val)]==val || hash2[func2(k,val)]==val)
            return 1;
        else
            return 0;
}

void sterge(int val,int k, int *hash1, int *hash2)
{
    if (hash1[func1(val,k)]==val)
        hash1[func1(val,k)]=0;
    else
        if (hash2[func2(val,k)]==val)
            hash2[func2(val,k)]=0;
}

void insereaza(int val, int k, int *hash1, int *hash2 )
{
    int x,y,q=0,l=1,init;
    init=val;
    x=func1(val,k);
    y=func2(val,k);
    while (q==0)
    {
        if (hash1[x]==0)
        {
            hash1[x]=val;
            q=1;
        }
        else
            if (hash2[y]==0)
            {
                hash2[y]=val;
                q=1;
            }
            else
            {
                if (l == 1)
            {
                int aux = val;
                val = hash1[x];
                hash1[x] = aux;
            }
            else
            {
                int aux = val;
                val = hash2[y];
                hash2[y] = aux;
            }
            l = - l;
        }
        if (init == val && l == 1) break;
    }
}
int main()
{
    int k=979457;
    int *hash1 = (int*)calloc(k,sizeof(int));
    int *hash2 = (int*)calloc(k,sizeof(int));
    int n,op,val;
    f>>n;
    while (n>0)
    {
        f>>op>>val;
        if (op==1)
            insereaza(val,k, hash1, hash2);
        if (op==2)
            sterge(val, k, hash1, hash2);
        if (op==3)
            if (cauta(val,k,hash1,hash2)==0)
                g << 0 << "\n";
            else
                g << 1 << "\n";
        n--;
    }
}