Cod sursa(job #1522030)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 11 noiembrie 2015 08:43:26
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
ifstream f("hashuri.in");
ofstream g("hashuri.out");
struct Treap{
int key,priority;
Treap * left,*right;
Treap(int key,int priority,Treap* left,Treap* right)
{
    this->key=key;
    this->priority=priority;
    this->left=left;
    this->right=right;
}


}*Root,*nil;
void rotLeft(Treap* &N)
{
    Treap* t=N->left;
    N->left=t->right;
    t->right=N;
    N=t;
}

void rotRight(Treap* &N)
{
    Treap* t=N->right;
    N->right=t->left;
    t->left=N;
    N=t;
}
void balance(Treap* N)
{
    if(N->priority < N->left->priority)
        rotLeft(N);
    else if(N->priority<N->right->priority)
        rotRight(N);
}


void Insert(int key,int priority,Treap* &N)
{
    if(N==nil)
    {
        N=new Treap(key,priority,nil,nil);
        return;
    }
    if(N->key>key)
    {
        Insert(key,priority,N->left);
    }

    else
    {
        if(N->key<key)
            Insert(key,priority,N->right);
    }
    balance(N);
}

void Erase(int key,Treap* &N)
{
    if(N==nil)
        return;
    if(N->key>key)
    {
        Erase(key,N->left);
    }
    else
    {
        if(N->key<key)
            Erase(key,N->right);
        else
        {
            if(N->left==nil && N->right==nil)
                delete N,N=nil;
            else
            {
                if(N->left->priority>N->right->priority)
                    rotLeft(N);
                else
                    rotRight(N);
                Erase(key,N);
            }
        }
    }
}

bool Find(int key,Treap* &N)
{
    if(N==nil)
        return 0;
    if(N->key>key)
        return Find(key,N->left);
    if(N->key<key)
        return Find(key,N->right);
    return 1;
}
int main()
{
    int N;
    f>>N;
    srand(time(NULL));
    nil=new Treap(0,0,NULL,NULL);
    Root=nil;
    for(int i=1;i<=N;i++)
    {
        int op,x;
        f>>op>>x;
        if(op==1 && !Find(x,Root))
        {

            Insert(x,rand()+1,Root);
        }
        if(op==2 && Find(x,Root))
        {
            Erase(x,Root);
        }
        if(op==3)
        {
            g<<Find(x,Root)<<"\n";
        }
    }
    return 0;
}