Cod sursa(job #1322277)

Utilizator sanzianaioneteIonete Sanziana sanzianaionete Data 19 ianuarie 2015 22:08:34
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
struct pct
{
    int v,p;
}h[200005];
int poz[200005],nr=0,c,n,x;
void upheap(int k)
{
    if(k==1||h[k>>1].v<h[k].v)
        return;
    poz[h[k].p]=k>>1;
    poz[h[k>>1].p]=k;
    pct aux=h[k];
    h[k]=h[k>>1];
    h[k>>1]=aux;
    upheap(k>>1);
}
void downheap(int k)
{
    if((k<<1)>nr||(h[(k<<1)].v>=h[k].v&&h[(k<<1)+1].v>=h[k].v))
        return;
    pct aux;
    if(h[(k<<1)].v<h[(k<<1)+1].v)
    {
        poz[h[(k<<1)].p]=k;
        poz[h[k].p]=(k<<1);
        aux=h[(k<<1)];
        h[(k<<1)]=h[k];
        h[k]=aux;
        downheap((k<<1));
    }
    else
    {
        poz[h[(k<<1)+1].p]=k;
        poz[h[k].p]=(k<<1)+1;
        aux=h[(k<<1)+1];
        h[(k<<1)+1]=h[k];
        h[k]=aux;
        downheap((k<<1)+1);
    }
}
int main()
{
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>c;
        if(c==1)
        {
            nr++;
            f>>h[nr].v;h[nr].p=nr;poz[nr]=nr;
            upheap(nr);
        }
        if(c==2)
        {
            f>>x;
            h[poz[x]]=h[nr];
            nr--;
            upheap(poz[x]);
            downheap(poz[x]);
        }
        if(c==3)
            g<<h[1].v<<"\n";
    }
    f.close();g.close();
    return 0;
}