Cod sursa(job #1577106)

Utilizator ChiriGeorgeChiriluta George-Stefan ChiriGeorge Data 23 ianuarie 2016 11:26:39
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <cstdio>
#define DMAX 200100

using namespace std;

FILE*fin;
ofstream fout("heapuri.out");

struct arbore
{
    int val;
    int nrord;
};

arbore H[DMAX];
int poz[DMAX];

int nrop, tip, value, pozmin;
int n;

void inserare(int inf);
void combinare(int i);
void creare_combinari();

int main()
{
    fin = freopen("heapuri.in", "r", stdin);
    fscanf(fin, "%d", &nrop);
    for(int i = 1; i <= nrop; i++)
    {
        fscanf(fin, "%d", &tip);
        if(tip != 3)
        {
            fscanf(fin, "%d", &value);
            if(tip == 1)
                inserare(value);
            else
            {
                for(int j = 1; j <= n; j++)
                    if(H[j].nrord == value)
                    {
                        pozmin = j;
                        break;
                    }
                H[pozmin] = H[n];
                n--;
                combinare(pozmin);
            }
        } else fout << H[1].val<< '\n';
    }
    fout << '\n';
    return 0;
}

void inserare(int inf)
{
    int fiu, tata;
    fiu = ++n;
    tata = fiu/2;
    while(tata > 0 && H[tata].val > inf)
    {
        H[fiu] = H[tata];
        fiu = tata;
        tata = tata/2;
    }
    H[fiu].val = inf;
    H[fiu].nrord = n;
    poz[n] = fiu;
}

void combinare(int i)
{
    arbore inf = H[i];
    int tata, fiu;
    tata = i;
    fiu = 2*i;
    while(fiu <= n)
    {
        if(fiu + 1 <= n && H[fiu].val > H[fiu + 1].val)
            ++fiu;
        if(H[fiu].val < inf.val)
        {
            H[tata] = H[fiu];
            tata = fiu;
            fiu = 2 * tata;
        }
        else break;
    }
    H[tata] = inf;
}

void creare_combinari()
{
    int i;
    for(i = n/2; i >= 0; i--)
        combinare(i);
}