Cod sursa(job #1322502)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 20 ianuarie 2015 08:55:39
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.94 kb
#include <bits/stdc++.h>

using namespace std;

class Skiplist
{
public:

    class Node
    {
    public:

        Node **Next;
        int Value;

        explicit Node()
        {
        }

        Node(int value, int level)
        {
            Value = value;
            Next = new Node*[level];

            for (int i = 0; i < level; ++i)
                Next[i] = NULL;
        }
    };

    Node *Head;
    int MAX_LEVEL;

    Skiplist()
    {
        MAX_LEVEL = 32;
        Head = new Node(0, 32);

        srand(time(NULL));
    }

    int generateLevel()
    {
        int level = 0;

        for ( int R = rand(); ( R & 1 ) == 1; R >>= 1 )
            level++;

        if ( level > MAX_LEVEL )
            level = MAX_LEVEL + 1;

        return level;
    }

    void insert(const int value)
    {
        int level = generateLevel();

        Node *newNode = new Node(value, level + 1);
        Node *current = Head;

        for (int i = MAX_LEVEL - 1; i >= 0; i--)
        {
            while ( current->Next[i] != NULL && current->Next[i]->Value <= value )
                current = current->Next[i];

            if ( i <= level )
            {
                newNode->Next[i] = current->Next[i];
                current->Next[i] = newNode;
            }
        }
    }

    bool find(const int value)
    {
        Node *current = Head;

        for (int i = MAX_LEVEL - 1; i >= 0; i--)
        {
            while ( current->Next[i] != NULL && current->Next[i]->Value < value )
                current = current->Next[i];

            if ( current->Next[i] != NULL && current->Next[i]->Value == value )
                return true;
        }

        return false;
    }

    void remove(const int value)
    {
        Node *current = Head;

        for (int i = MAX_LEVEL - 1; i >= 0; i--)
        {
            while ( current->Next[i] != NULL && current->Next[i]->Value <= value )
            {
                if ( current->Next[i]->Value == value )
                {
                    current->Next[i] = current->Next[i]->Next[i];
                    break;
                }

                current = current->Next[i];
            }
        }
    }

    void print()
    {
        Node *current = Head->Next[0];

        while ( current )
        {
            cout << current->Value << " ";
            current = current->Next[0];
        }
    }
};

int main()
{
    ifstream in("hashuri.in");
    ofstream out("hashuri.out");

    ios_base::sync_with_stdio( false );

    int N;
    Skiplist Set;

    in >> N;

    while ( N-- )
    {
        int tip, x;

        in >> tip >> x;

        switch(tip)
        {
            case 1: Set.insert(x); break;
            case 2: Set.remove(x); break;
            case 3: out << Set.find(x) << "\n"; break;

            default: cerr << "Error\n";
        }
    }

    return 0;
}