Cod sursa(job #805181)

Utilizator alexarnautuArnautu Alexandru alexarnautu Data 30 octombrie 2012 22:46:34
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <utility>
#include <vector>

using namespace std;

FILE * iFile;
FILE * oFile;

vector<pair <int, int> > a;
int n, c, k, x, p, H[200005];

void h_down(int P, int L)
{
    int F=2*P, aux;
    if(F > L) return;
    if(F < L)
        if(a[H[F]].first > a[H[F+1]].first)
            F++;
    if(a[H[P]].first > a[H[F]].first)
    {
        aux = H[P];
        H[P] = H[F];
        H[F] = aux;
        a[H[P]].second = P;
        a[H[F]].second = F;
    }
}

void h_up(int P)
{
    int aux, T=P/2;
    if(!T) return;
    if(a[H[T]].first > a[H[P]].first)
    {
        aux = H[T];
        H[T] = H[P];
        H[P] = aux;
        a[H[P]].second = P;
        a[H[T]].second = T;
        h_up(T);
    }
}


int main()
{
    iFile = fopen("heapuri.in", "r");
    oFile = fopen("heapuri.out", "w");

    fscanf(iFile, "%d", &k);

    a.push_back(make_pair(0, 0));

    for(int i=1;i<=k;i++)
    {
        fscanf(iFile, "%d", &c);
        if(c==1)
        {
            fscanf(iFile, "%d", &x);
            n++;
            a.push_back(make_pair(x, n));
            H[n] = n;
            h_up(n);
        }
        if(c==2)
        {
            fscanf(iFile, "%d", &x);
            H[a[x].second] = H[n], a[H[n]].second=a[x].second, n--, h_up(a[H[n]].second), h_down(a[H[n]].second, n);
        }
        if(c==3)
        {
            fprintf(oFile, "%d\n", a[H[1]].first);
        }
    }



    fclose(iFile);
    fclose(oFile);

    return 0;
}