Cod sursa(job #3226251)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 20 aprilie 2024 18:54:43
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.07 kb
#include <bits/stdc++.h>
using namespace std;

///----------TOGGLES
#define FIO
#define LONGER
//#define TESTS

///---------

#ifdef LONGER
    #define int long long
#endif // LONGER

#ifdef FIO
    const string fname="heapuri";
    ifstream in(fname+".in");
    ofstream out(fname+".out");
    #define cin in
    #define cout out
#endif // FIO

///--------

#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

///-------STL++-----
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) x.size()
#define pb(x,y) x.push_back(y)
#define mp(x,y) make_pair(x,y)
#define fr(i,n) for(int i=1;i<=n;i++)
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pdd = pair<double, double>;
using veci = vector<int>;
using vecp = vector<pii>;
template<typename T> using PQ = priority_queue<T, vector<T>, greater<T> >;

///-----CODE GOES HERE-----

struct Treap{
    Treap *l, *r;
    int val, prio, siz;
    Treap() {l=r=0; siz=1;}
    Treap(int val) : l(0), r(0), val(val), prio(rand()), siz(1){}
    Treap(int val, int prio) :  l(0), r(0),val(val), prio(prio), siz(1) {}
};


using trip = Treap*;
int getSiz(trip t)
{
    if(!t) return 0;
    return t->siz;
}

void updateSiz(trip t)
{
    if(!t) return;
    t->siz=1+ getSiz(t->l) + getSiz(t->r);
}

void split(trip t, trip &l, trip &r, int val)
{
    if(!t) l=r=0;
    else if(t->val<=val) split(t->r, t->r, r, val), l=t;
    else split(t->l, l, t->l, val), r=t;
    updateSiz(l);
    updateSiz(r);
}

//presupunem ca au valorile in ordine (??)
void merge(trip l, trip r, trip &t)
{
    if(!l||!r) t=l?l:r;
    else if(l->prio>=r->prio) merge(l->r, r, l->r), t=l;
    else merge(l, r->l, r->l), t=r;
    updateSiz(t);
}

void insert(trip &t, trip x)
{
    assert(x!=0);
    if(!t) t=x;
    else if(t->prio<x->prio)
    {
        split(t, x->l,x->r,x->val);
        t=x;
    }
    else
    {
        if(x->val<=t->val) insert(t->l, x);
        else insert(t->r, x);
    }
    updateSiz(t);
}

void erase(trip &t, int val)
{
    if(!t) return;
    if(t->val==val)
    {
        trip d=t;
        merge(t->l, t->r, t);
        delete d;
    }
    else if(val<=t->val) erase(t->l, val);
    else erase(t->r, val);
    updateSiz(t);
}

int getSmall(trip x)
{
    assert(x);
    if(!x->l) return x->val;
    return getSmall(x->l);
}

const int maxn = 2e5+5;

int v[maxn], vk;
void solve()
{
    trip root=0;
    int n; cin>>n;
    int c,x;
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        if(c==1)
        {
            cin>>v[++vk];
            insert(root, new Treap(v[vk]));
        }
        else if(c==2)
        {
            cin>>x;
            erase(root, v[x]);
        }
        else if(c==3)
        {
            cout<<getSmall(root)<<'\n';
        }
        else assert(0);
    }
}

///---MAIN FUNC-------

int32_t main()
{
    IOS;
    int t=1;
    #ifdef TESTS
        cin>>t;
    #endif // TESTS
    while(t--)
    {
        solve();
    }
    return 0;
}