Cod sursa(job #1993656)

Utilizator Bodo171Bogdan Pop Bodo171 Data 23 iunie 2017 15:17:35
Problema Hashuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
int n,i,x,tip,prio;
struct Treap
{
    int val,pr;
    Treap *ls,*rs;
    Treap()
    {

    }
    Treap(int value,int priority,Treap *a,Treap *b)
    {
        this->val=value;
        this->pr=priority;
        this->ls=a;
        this->rs=b;
    }
}*R,*nil;
int finds(Treap* nod)
{
    if(nod->val==x) return 1;
    if(nod==nil) return 0;
    if(x<nod->val) return finds(nod->ls);
    return finds(nod->rs);
}
void rot1(Treap* &nod)
{
    Treap *T=nod->ls;
    nod->ls=T->rs;T->rs=nod;
    nod=T;
}
void rot2(Treap* &nod)
{
    Treap *T=nod->rs;
    nod->rs=T->ls;T->ls=nod;
    nod=T;
}
void balance(Treap* &nod)
{
    if(nod->ls->pr>nod->pr)
        rot1(nod);
    if(nod->rs->pr>nod->pr)
        rot2(nod);
}
void ins(Treap* &nod)
{
    if(nod==nil)
    {
        nod=new Treap(x,prio,nil,nil);
        return;
    }
    if(x<nod->val) ins(nod->ls);
    else ins(nod->rs);
    balance(nod);
}
void del(Treap* &nod)
{
    if(x<nod->val) del(nod->ls);
    if(x>nod->val) del(nod->rs);
    if(x==nod->val)
    {
        if(nod->ls==nil&&nod->rs==nil)
        {
            delete nod;
            nod=nil;
            return;
        }
        if(nod->ls->pr>nod->rs->pr) rot1(nod);
        else rot2(nod);
        del(nod);
    }
}
int main()
{
    ifstream f("hashuri.in");
    ofstream g("hashuri.out");
    f>>n;
    srand(time(NULL));
    R=nil=new Treap(0,0,NULL,NULL);
    for(i=1;i<=n;i++)
    {
        f>>tip>>x;
        if(tip==1)
        {
            if(!finds(R)) ins(R);
        }
        if(tip==2)
        {
            if(finds(R)) del(R);
        }
        if(tip==3)
        {
            g<<finds(R)<<'\n';
        }
    }
    return 0;
}