Cod sursa(job #1747590)

Utilizator rangerChihai Mihai ranger Data 25 august 2016 10:56:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;


struct item{
    int key, prior;
    item * l, * r;
    item(){}
    item(int key) : key(key), prior((rand() << 16) ^ rand()), l(NULL), r(NULL) {}
};
using pitem = item*;
pitem root;
void split(pitem t, int x, pitem& l, pitem& r)
{
    if (!t)
        l = r = NULL;
    else if (x > t->key)
        split(t->r, x, t->r, r), l = t;
    else
        split(t->l, x,l, t->l), r = t;
}
void merge(pitem& t, pitem l, pitem r)
{
    if (!l || !r)
        t = l ? l : r;
    else if (l->prior > r->prior)
        merge(l->r, l->r, r), t = l;
    else
        merge(r->l, l, r->l), t = r;
}
int find(pitem t, int key)
{
    if (!t) return 0;
    if (t->key == key)
        return 1;
    return find(key <= t->key ? t->l : t->r, key);
}
void insert(pitem& t, pitem it)
{
    if (!t)
        t = it;
    else if (it->prior > t->prior)
        split(t, it->key, it->l, it->r), t = it;
    else
        insert(it->key <= t->key ? t->l : t->r, it);
}
void erase(pitem& t, int key)
{
    if (t->key == key)
        merge(t, t->l, t->r);
    else
        erase(key < t->key ? t->l : t->r, key);
}

int MIN()
{
    pitem t=root;
    while(t->l) t=t->l;
    return t->key;
}
int el[200200];
int el_count;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int main()
{
    int t;

    fin>>t;

    while(t--)
    {
        int tip;
        fin>>tip;
        if (tip==1){int val;fin>>val; insert(root,new item(val)); el[++el_count] = val;}
        if (tip==2){int ps; fin>>ps; erase(root,el[ps]);}
        if (tip==3){fout<<MIN()<<'\n';}
    }
}