Cod sursa(job #1378684)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 6 martie 2015 13:40:48
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
using namespace std;
#include <fstream>
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
#define Nmax 200001

int heap[Nmax], lg = 0; // heap care contine indicii elementelor in vectorul v
int v[Nmax], nr = 0;    // numerele citite in ordine
int poz[Nmax];          // pozitia in heap a elementului de pe pozitia i in vectorul v

void adauga(int) ;
void sterge(int) ;

int main()
{
    int n, a, tip;
    
    fin >> n;
    for(; n; --n)
    {
        fin >> tip;
        if(tip == 3) fout << v[heap[1]] << '\n';
        else
        {
            fin >> a;
            if(tip == 1) adauga(a);
            else sterge(poz[a]);
        }
    }
    return 0;
}


void adauga(int val)
{   //adauga elementul val
    nr++; lg++;
    v[nr] = val; heap[lg] = nr; poz[nr] = lg;
    
    for(int p = lg; p > 1 && v[heap[p / 2]] > v[heap[p]]; p /= 2)
    {
        swap(heap[p], heap[p / 2]);
        swap(poz[heap[p]], poz[heap[p / 2]]);
    }
}


void sterge(int p)
{   //sterge elementul de pe pozitia p din heap
    heap[p] = heap[lg]; heap[lg] = 0; --lg;
    poz[heap[p]] = p;
    
    for(int fiu; ; )
    {
        fiu = p;
        
        if(2 * p <= lg && v[heap[2 * p]] < v[heap[fiu]]) fiu = 2 * p;
        if(2 * p + 1 <= lg && v[heap[2 * p + 1]] < v[heap[fiu]]) fiu = 2 * p + 1;
        
        if(p == fiu) return;
        else
        {
            swap(heap[p], heap[fiu]);
            swap(poz[heap[p]], poz[heap[fiu]]);
            
            p = fiu;
        }
    }
}