Cod sursa(job #2035563)

Utilizator LucaSeriSeritan Luca LucaSeri Data 9 octombrie 2017 17:16:06
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.44 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 9;
const int modulo = 100000;
class Treapuri{
    public:
    struct treap{
        treap* st;
        treap* dr;
        int val;
        int g;
        treap(treap* stanga, treap*dreapta, int v, int gr){
            this -> st = stanga;
            this -> dr = dreapta;
            this -> val = v;
            this -> g = gr;
        }
        treap(){
            this -> st = NULL;
            this -> dr = NULL;
            this -> val = -1;
            this -> g = 0;
        }
    };
    treap *NILL, *root[modulo+10];
    int random(){
        return (rand()<<15 + rand())%MOD + 1;
    }
    void Start(){
        NILL = new treap();
        for(int i = 0; i <= modulo; ++i){
            root[i] = NILL;
        }
    }

    void leftRotate(treap*& node){
        treap* aux;
        aux = node->st;
        node->st = aux->dr;
        aux->dr = node;
        node = aux;
    }

    void rightRotate(treap*& node){
        treap* aux;
        aux = node->dr;
        node->dr = aux->st;
        aux->st = node;
        node = aux;
    }

    void balance(treap*& node){
        if(node->st != NILL && node->st->g > node-> g) leftRotate(node);
        if(node->dr != NILL && node->dr->g > node-> g) rightRotate(node);
    }

    void Add(treap *& node, int valoare){
        if(node == NILL){
            node = new treap(NILL, NILL, valoare, random());
            return;
        }
        if(node->val > valoare) Add(node->st, valoare);
        else Add(node->dr, valoare);
        balance(node);
    }

    bool findd(treap*& node, int valoare){
        if(node == NILL) return 0;
        if(node->val == valoare) return 1;
        if(node->val > valoare) return findd(node->st, valoare);
        else return findd(node->dr, valoare);
    }

    void erasee(treap*& node, int valoare){
        if(node == NILL) return;

        if(node->val == valoare){
            if(node->st == NILL && node->dr == NILL){
                delete(node);
                node = NILL;
                return;
            }
            if(node->st != NILL && node->dr != NILL){
                if(node->st->g > node->dr->g){
                    leftRotate(node);
                    erasee(node->dr, valoare);
                    return;
                }
                rightRotate(node);
                erasee(node->st, valoare);
                return;
            }

            if(node->st != NILL){
                leftRotate(node);
                erasee(node->dr, valoare);
                return;
            }
            rightRotate(node);
            erasee(node->st, valoare);
            return;
        }
        if(node->val > valoare) erasee(node->st, valoare);
        else erasee(node->dr, valoare);
    }

}*Treapulet;

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

int main(){
    int n;
    f >> n;
    Treapulet = new Treapuri;
    Treapulet->Start();
    for(int i = 0; i < n; ++ i){
        int cd, temp;
        f >> cd >> temp;
        int rest = temp%modulo;
        if(cd == 1 && !Treapulet->findd(Treapulet->root[rest], temp)) Treapulet->Add(Treapulet->root[rest], temp);
        if(cd == 2 && Treapulet->findd(Treapulet->root[rest], temp)) Treapulet->erasee(Treapulet->root[rest], temp);
        if(cd == 3) g << Treapulet->findd(Treapulet->root[rest], temp) << '\n';
    }
    return 0;
}