Cod sursa(job #1510508)

Utilizator refugiatBoni Daniel Stefan refugiat Data 25 octombrie 2015 09:58:14
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
const int IMAX=200005;
int h[IMAX],poz[IMAX],v[IMAX],nrh,nr;
void up_heap(int nod)
{
    while(nod>1&&v[h[nod]]<v[h[nod/2]])
    {
        swap(h[nod],h[nod/2]);
        swap(poz[h[nod]],poz[h[nod/2]]);
        nod>>=1;

    }
}
void down_heap(int nod)
{
    while(nod*2<=nrh && (v[h[nod]]>v[h[nod*2]] || (nod*2+1<=nrh && v[h[nod]]>v[h[nod*2+1]])))
    {
        if(v[h[nod]]>v[h[nod*2]])
        {
            swap(h[nod],h[nod*2]);
            swap(poz[h[nod]],poz[h[nod*2]]);
            nod<<=1;
        }
        else
        {
            swap(h[nod],h[nod*2+1]);
            swap(poz[h[nod]],poz[h[nod*2+1]]);
            nod=nod*2+1;
        }
    }
}
int main()
{
    ifstream si;
    si.open("heapuri.in");
    ofstream so;
    so.open("heapuri.out");
    int n;
    si>>n;
    int i,a,b;
    for(i=0;i<n;++i)
    {
        si>>a;
        if(a==1)
        {
            si>>v[++nr];
            h[++nrh]=nr;
            poz[nr]=nrh;
            up_heap(nrh);
        }
        else if(a==2)
        {
            si>>b;
            h[poz[b]]=h[nrh];
            poz[h[nrh]]=poz[b];
            nrh--;
            down_heap(poz[b]);
        }
        else
            so<<v[h[1]]<<'\n';
    }
}