Cod sursa(job #1691640)

Utilizator httpsLup Vasile https Data 18 aprilie 2016 23:49:25
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
using namespace std;
#ifdef INFOARENA
#define cout fout
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
#else
ifstream fin("date.in");
#endif // INFOARENA

/// ///////////////////////////////////////////

struct T{
int pr,val;
T *left,*right;
};

T* nil=new T({0,0,NULL,NULL});
T* root=nil;

void rot_left(T*&n)
{
    T*son = n->left;

    n->left = son->right;
    son->right = n;

    n=son;
}


void rot_right(T*&n)
{
    T*son = n->right;

    n->right = son->left;
    son->left = n;

    n=son;
}

void balance(T *&n)
{
    if(n->left->pr>n->pr) rot_left(n);
    else if(n->right->pr>n->pr) rot_right(n);
}

void insert_treap(T *&n,int pr,int val)
{
    if(n==nil)
    {
        n=new T({pr,val,nil,nil});
        return;
    }

    if(n->val==val) return;

    if(n->val>val) insert_treap(n->left,pr,val);
    else insert_treap(n->right,pr,val);

    balance(n);
}

void delete_treap(T*&n,int val)
{
    if(n==nil) return;

    if(n->left==nil && n->right==nil)
    {
        if(n->val==val) n=nil;
        return;
    }

    if(n->val>val) delete_treap(n->left,val);
    else if(n->val<val) delete_treap(n->right,val);
    else{
    if(n->left->pr > n->right->pr) rot_left(n);
    else rot_right(n);

    delete_treap(n,val);
    }
}

bool quer(T *n,int val)
{
    if(n==nil) return false;

    if(n->val==val) return true;

    if(val<n->val) return quer(n->left,val);
    else return quer(n->right,val);
}

int main()
{
    int n,tip,x;
    fin>>n;

    for(;n;--n)
    {
        fin>>tip>>x;

        if(tip==1)insert_treap(root,rand()+1,x);
        else if(tip==2) delete_treap(root,x);
        else cout<<quer(root,x)<<'\n';
    }
}