Cod sursa(job #1416963)

Utilizator karlaKarla Maria karla Data 9 aprilie 2015 11:06:34
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <stdio.h>
#define left(x) x * 2
#define right(x) x * 2 + 1

using namespace std;

int n, nr, poz[200100], v[200100], h[200100];
FILE*f=fopen("heapuri.in","r"),*g=fopen("heapuri.out","w");

void interschimbare (int a, int b)
{
    int aux = v[a];
    v[a] = v[b];
    v[b] = aux;

    aux = h[a];
    h[a] = h[b];
    h[b] = aux;

}

void up(int a)
{
    while(a >= 1)
    {
        if(v[a/2] > v[a])
        {
            poz[h[a/2]] = a;
            poz[h[a]] = a/2;
            interschimbare(a/2,a);
        }
        if(v[a] < v[a/2 +1])
        {
            poz[h[a]] = a/2+1;
            poz[h[a/2+1]] = a;
            interschimbare(a/2+1,a);
        }
        a /= 2;
    }
}


void down(int a)
{
    int s = 1, f = a;
    while(left(a) <= nr )
    {
        f = left(a);
        if(right(s) <= nr && v[right(a)] < v[left(a)])
            f = right(a);
        if(v[f] < v[a])
        {
            poz[h[f]] = a;
            poz[h[a]] = f;
            interschimbare(f,a);
        }
        a = f;
    }
    if(v[f] > v[f + 1] && f+1 == nr)
    {
        poz[h[f]] = f+1;
        poz[h[f+1]] = f;
        interschimbare(f,f+1);
    }
    else if(f == nr && v[f] < v[f-1])
    {
        poz[h[f]] = f-1;
        poz[h[f-1]] = f;
        interschimbare(f,f-1);
    }

}

int main()
{
    int o, y;
    fscanf(f,"%d ",&n);
    int in = 0;
    for(int i = 1; i <= n; i++)
    {
        fscanf(f,"%d",&o);
        if(o == 1)
        {
            fscanf(f,"%d ",&y);
            in++;
            nr++;
            v[nr] = y;
            poz[in]= nr;
            h[nr]=in;
            up(nr);
        }
        if(o == 2)
        {
            fscanf(f,"%d ",&y);
            int d = poz[y];
            interschimbare(poz[y], nr);
            nr--;
            if(d > 1 && v[d/2] > v[d])
            {
                up(d);
            }
            else
            {
                down(d);
            }
        }
        if(o == 3)
            fprintf(g,"%d\n", v[1]);
    }
    return 0;
}