Cod sursa(job #1507666)

Utilizator retrogradLucian Bicsi retrograd Data 21 octombrie 2015 19:53:50
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;

struct node {
    int key, l, r, priority, minv, val;
};
node T[200005];
int root, nodes;


void update(int x) {
    int minv = T[x].val;
    minv = min(minv, T[T[x].l].minv);
    minv = min(minv, T[T[x].r].minv);
    T[x].minv = minv;
}

void split(int x, int key, int &left, int &right) {
    if(x == 0) left = right = 0;
    else if(key < T[x].key) split(T[x].l, key, left, T[x].l), right = x;
    else split(T[x].r, key, T[x].r, right), left = x;

    update(x);
}

void join(int &x, int left, int right) {
    if(left == 0 || right == 0)
        x = (left) ? left : right;
    else if(T[left].priority > T[right].priority) {
        join(T[left].r, T[left].r, right);
        x = left;
    } else {
        join(T[right].l, left, T[right].l);
        x = right;
    }

    update(x);
}

void add(int &x, int what) {
    if(x == 0) x = what;
    else if(T[what].priority <= T[x].priority)
        add((T[what].key < T[x].key) ? T[x].l : T[x].r, what);
    else {
        split(x, T[what].key, T[what].l, T[what].r);
        x = what;
    }

    update(x);
}
void ins(int key, int value) {
    ++nodes;
    T[nodes].key = key;
    T[nodes].priority = rand();
    T[nodes].val = T[nodes].minv = value;
    T[nodes].l = T[nodes].r = 0;

    add(root, nodes);
}


void ers(int &x, int key) {
    if(T[x].key == key) join(x, T[x].l, T[x].r);
    else ers((key < T[x].key) ? T[x].l : T[x].r, key);

    update(x);
}

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

    T[0].val = T[0].minv = 1000000005;

    int n, t, a, timer = 0;
    fin>>n;
    while(n--) {
        fin>>t;
        if(t == 3) fout<<T[root].minv<<'\n';
        else {
            fin>>a;
            if(t == 1) ins(++timer, a);
            else ers(root, a);
        }
    }
    return 0;
}