Cod sursa(job #2008581)

Utilizator KusikaPasa Corneliu Kusika Data 6 august 2017 21:44:42
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;

typedef struct Treap {
    int key, prio, mn, mx, dif;
    Treap *l, *r;

    Treap(int x) { key = x, prio = rand() + 1, mn = x, mx = x, dif = INF, l = r = 0; }

    void update() {
        if (this == 0) return;
        mn = mx = key, dif = INF;
        if (l) mn = l->mn, dif = min({dif, l->dif, key - l->mx});
        if (r) mx = r->mx, dif = min({dif, r->dif, r->mn - key});
    }
} *T;

T Merge (T l, T r) {
    if (!l) return r;
    if (!r) return l;
    l->update(), r->update();
    if (l->prio >= r->prio) {
        l->r = Merge(l->r,r);
        l->r->update();
        l->update();
        return l;
    } else {
        r->l = Merge(l,r->l);
        r->l->update();
        r->update();
        return r;
    }
}

void Split(T n, int x, T &l, T &r) {
    l = r = 0;
    if (!n) return;
    if (n->key < x) {
        Split(n->r,x,n->r,r);
        l = n;
    } else {
        Split(n->l,x,l,n->l);
        r = n;
    }
    if (l) l->update();
    if (r) r->update();
}

int main() {
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    T root = 0;
	string s;
	while (cin >> s) {
        if (s.size() > 1) {
            if (!root || root->mx == root->mn) cout << "-1\n";
            else if (s == "MAX") cout << root->mx - root->mn << '\n';
            else cout << root->dif << '\n';
        } else {
            int x;
            cin >> x;
            T l, m, r;
            Split(root,x,l,m), Split(m,x+1,m,r);
            if (s == "I") root = Merge(Merge(l,new Treap(x)),r);
            else if (s == "S") {
                if (!m) cout << "-1\n";
                delete(m);
                root = Merge(l,r);
            } else {
                cout << (m != 0) << '\n';
                root = Merge(Merge(l,m),r);
            }
        }
	}
}