Cod sursa(job #1679787)

Utilizator KOzarmOvidiu Badea KOzarm Data 8 aprilie 2016 11:18:04
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>

using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct el
{
    int val,nr;
}a[200005];
int crt,b[200005],k,n,i,p,x,t;
void adauga(int nod)
{
    if(nod>0&&a[nod].val>a[crt].val)
    {
        int tmp=a[nod].val;
        a[nod].val=a[crt].val;
        a[crt].val=tmp;
        tmp=a[nod].nr;
        a[nod].nr=a[crt].nr;
        a[crt].nr=tmp;
        tmp=b[a[crt].nr];
        b[a[crt].nr]=b[a[nod].nr];
        b[a[nod].nr]=tmp;
        crt=nod;
        adauga(nod/2);
    }
}
void sorteaza(int nod)
{
    if(nod/2>0&&a[nod/2].val>a[nod].val)
    {
        el tmp=a[nod];
        a[nod]=a[nod/2];
        a[nod/2]=tmp;
        tmp.val=b[a[nod].nr];
        b[a[nod].nr]=b[a[nod/2].nr];
        b[a[nod/2].nr]=tmp.val;
        sorteaza(nod/2);
    }
    else
    if(2*nod<=k)
    {
        if(2*nod+1>k)
        {
            if(a[2*nod].val<a[nod].val)
            {
                el tmp=a[nod];
                a[nod]=a[2*nod];
                a[2*nod]=tmp;
                tmp.val=b[a[nod].nr];
                b[a[nod].nr]=b[a[2*nod].nr];
                b[a[2*nod].nr]=tmp.val;
                sorteaza(2*nod);
            }
        }
        else
        {
            int s;
            if(a[2*nod].val>a[2*nod+1].val)
                s=2*nod+1;
            else
                s=2*nod;
            if(a[s].val<a[nod].val)
            {
                el tmp=a[nod];
                a[nod]=a[s];
                a[s]=tmp;
                tmp.val=b[a[nod].nr];
                b[a[nod].nr]=b[a[s].nr];
                b[a[s].nr]=tmp.val;
                sorteaza(s);
            }
        }
    }
}
void sterge(int poz)
{
    a[b[poz]]=a[k];
    k--;
    b[a[b[poz]].nr]=b[poz];
    sorteaza(b[poz]);
}
int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>p;
        if(p==1)
        {
            fin>>x;
            a[++k].val=x;
            a[k].nr=++t;
            b[t]=k;
            crt=k;
            adauga(k/2);
        }
        else
        if(p==2)
        {
            fin>>x;
            sterge(x);
        }
        else
            fout<<a[1].val<<"\n";
    }
    return 0;
}