Cod sursa(job #1429958)

Utilizator george_stelianChichirim George george_stelian Data 7 mai 2015 17:19:31
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 3.27 kb
#include <cstdio>
#include <algorithm>
#include <ctime>

using namespace std;

class treap
{
    public:
        treap()
        {
            nil=new node(-1,-1);
            nil->left=nil->right=nil;
            rad=nil;
        }
        void insert(int val)
        {
            rad=insert(rad,val,rand());
        }
        void erase(int val)
        {
            rad=erase(rad,val);
        }
        int count(int val)
        {
            return count(rad,val);
        }
    private:
        struct node
        {
            node *left,*right;
            int val,priority;
            node(int val1,int priority1,node *left1,node *right1) {val=val1;priority=priority1;left=left1;right=right1;}
            node(int val1,int priority1) {val=val1;priority=priority1;}
        };
        node *rad,*nil;
        struct pairnode
        {
            node *left,*right;
            pairnode(node *left1,node *right1) {left=left1;right=right1;}
        };

        node *insert(node *nod,int val,int priority)
        {
            if(priority>nod->priority)
            {
                pairnode a=split(nod,val);
                return new node(val,priority,a.left,a.right);
            }
            if(val<nod->val) nod->left=insert(nod->left,val,priority);
            else nod->right=insert(nod->right,val,priority);
            return nod;
        }
        pairnode split(node *nod,int val)
        {
            if(nod==nil) return pairnode(nil,nil);
            if(val<nod->val)
            {
                pairnode a=split(nod->left,val);
                nod->left=a.right;
                return pairnode(a.left,nod);
            }
            else
            {
                pairnode a=split(nod->right,val);
                nod->right=a.left;
                return pairnode(nod,a.right);
            }
        }
        node *erase(node *nod,int val)
        {
            if(nod->val==val)
            {
                node *a=merge(nod->left,nod->right);
                delete nod;
                return a;
            }
            if(val<nod->val) nod->left=erase(nod->left,val);
            else nod->right=erase(nod->right,val);
            return nod;
        }
        node *merge(node *left,node *right)
        {
            if(left==nil && right==nil) return nil;
            if(left->priority>right->priority)
            {
                left->right=merge(left->right,right);
                return left;
            }
            else
            {
                right->left=merge(left,right->left);
                return right;
            }
        }
        int count(node *nod,int val)
        {
            if(nod==nil) return 0;
            if(nod->val==val) return 1;
            if(val<nod->val) return count(nod->left,val);
            else return count(nod->right,val);
        }
};

int main()
{
    freopen("hashuri.in", "r", stdin);
    freopen("hashuri.out", "w", stdout);
    srand(time(0));
    int n,a,x;
    treap v;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a,&x);
        if(a==1) if(!v.count(x)) v.insert(x);
        if(a==2) if(v.count(x)) v.erase(x);
        if(a==3) printf("%d\n",v.count(x));
    }
    return 0;
}