Cod sursa(job #1354712)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 21 februarie 2015 23:15:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
using namespace std;

struct pereche
{
  int poz,val;
};
pereche heap[200002],v[200002],pH,q;
int n,a,c,x,nrelem,i,vmin;

inline void adaug(int poz)
{
    int i,p,x;
    x=v[poz].val;
    nrelem++;
    // urcarea
    i=nrelem;
    p=i/2;
    pH=heap[p];
    while(p && pH.val>x)
    {
        heap[i]=pH;
        v[pH.poz].poz=i;
        i=p;
        p=i/2;
    }
    heap[i].poz=poz;
    heap[i].val=x;
    v[poz].poz=i;
}
inline void sterg(int poz)
{
    int p,i;
    q=heap[nrelem];
    nrelem--;
    p=v[poz].poz;
    while(2*p<=nrelem)
    {
        i=2*p;
        pH=heap[i];
        if(i+1<=nrelem && heap[i+1].val<pH.val)
        {
            pH=heap[i+1];
            i++;
        }
        if(pH.val<q.val)
        {
            heap[p]=pH;
            v[pH.poz].poz=p;
            p=i;
        }
        else break;
    }
    heap[p]=q;
    v[q.poz].poz=p;
}

int main()
{
     ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
    fin>>n;
    c=0;
    nrelem=0;
    for(i=1;i<=n;i++)
    {
        fin>>a;
        if(a==1)
        {
            fin>>x;
            c++;
            v[c].val=x;
            adaug(c);
        }else
        if(a==2)
        {
            fin>>x;
            sterg(x);
        }else
        {
            vmin=heap[1].val;
            fout<<vmin<<endl;
        }
    }

    fin.close();
    fout.close();
    return 0;
}