Cod sursa(job #805194)

Utilizator alexarnautuArnautu Alexandru alexarnautu Data 30 octombrie 2012 22:58:27
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 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;
    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)
    {
        swap(H[P], H[F]);
        a[H[P]].second = P;
        a[H[F]].second = F;
        h_down(F, L);
    }
}

void h_up(int P)
{
    int T=P/2;
    if(!T) return;
    if(a[H[T]].first > a[H[P]].first)
    {
        swap(H[T], H[P]);
        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, h_up(a[H[n]].second), n--, h_down(a[H[n+1]].second, n);

        }
        if(c==3)
        {
            fprintf(oFile, "%d\n", a[H[1]].first);
        }
    }

    fclose(iFile);
    fclose(oFile);

    return 0;
}