Cod sursa(job #1921096)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 10 martie 2017 11:21:45
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>

using namespace std;
FILE *fin = fopen("heapuri.in", "r");
FILE *fout = fopen("heapuri.out", "w");
#define N 200001
int h[N], poz[N], v[N];
int sizeh=0;
void schimb(int p, int q)
{
    int aux = h[q];
    h[q] = h[p];
    h[p] = aux;
    poz[h[q]] = q;
    poz[h[p]] = p;
}
void urca(int p)
{
    while(p>1 && v[h[p]] < v[h[p/2]])
    {
        schimb(p,p/2);
        p/=2;
    }
}
void coboara(int p)
{
    int bun = p;
    int fd = 2*p+1;
    int fs = 2*p;
    if(fd<=sizeh && v[h[fd]] > v[h[bun]])
    {
        bun = fd;
    }
    if(fs<=sizeh && v[h[fs]] > v[h[bun]])
    {
        bun = fs;
    }
    if(p!=bun)
    {
        schimb(bun,p);
        coboara(bun);
    }
}
void sterge(int pv)
{
    int p = poz[pv];
    schimb(p,sizeh);
    sizeh--;
    coboara(p);
    urca(p);
}
void adauga( int pv)
{
    sizeh++;
    poz[sizeh] = pv;
    h[pv] = sizeh;
    urca(sizeh);
}
int main()
{
    int n;
    int cate=0;
    int tip;
    fscanf(fin, "%d" , &n);
    for(int i=1;i<=n;i++)
    {
        fscanf(fin, "%d", &tip);
        if(tip == 1)
        {
            cate++;
            fscanf(fin, "%d", &v[cate]);
            adauga(cate);
        }
        if(tip == 2)
        {
            int x;
            fscanf(fin, "%d", &x);
            sterge(x);
        }
        if(tip == 3) fprintf(fout, "%d\n", h[1]);
    }
    return 0;
}