Cod sursa(job #805011)

Utilizator alexarnautuArnautu Alexandru alexarnautu Data 30 octombrie 2012 20:13:33
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <vector>

using namespace std;

FILE * iFile;
FILE * oFile;

vector<int> a;
int n, k, x, c, V[200001], pos[200005];

void heapdown(int P, int L)
{
    int F = 2 * P, aux;
    if(F > L) return;
    if(F < L)
        if(V[F] > V[F+1])
            F++;
    if(V[P] > V[F])
    {
        aux = V[P];
        V[P] = V[F];
        V[F] = aux;
        pos[V[F]] = F;
        pos[V[P]] = P;
        heapdown(F, L);
    }
}

void heapup(int P)
{
    int T = P/2, aux;
    if(!T) return;
    if(V[T] > V[P])
    {
        aux = V[T];
        V[T] = V[P];
        V[P] = aux;
        pos[V[T]] = T;
        pos[V[P]] = P;
        heapup(T);
    }
}

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

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

    for(int i=1;i<=k;i++)
    {
        fscanf(iFile, "%d", &c);
        if(c==1)
        {
            fscanf(iFile, "%d", &x);
            V[++n] = x;
            a.push_back(x);
            pos[x] = n;
            heapup(n);
        }
        if(c==2)
        {
            fscanf(iFile, "%d", &x);
            j = pos[a[x-1]];
          //  printf("%d ", j);
            //j = 1;
            //while(V[j] != a[x-1])
                //j++;
        //printf("%d\n", j);
            V[j] = V[n], heapup(j), n--, heapdown(j, n);
        }
        if(c==3)
            fprintf(oFile, "%d\n", V[1]);
    }

    fclose(iFile);
    fclose(oFile);

    return 0;
}