Cod sursa(job #1577882)

Utilizator ChiriGeorgeChiriluta George-Stefan ChiriGeorge Data 23 ianuarie 2016 22:28:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 3.47 kb
#include <fstream>
#include <cstdio>

using namespace std;

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

struct heap
{
    int info;
    int nr;
};

heap H[200100];
int nrop, x, n, caz, intro, poz[200100];

void inserare(int value)
{
    int i, tata = value, fiu;
    ++intro;
    ++n;
    fiu = n;
    tata = fiu/2;
    while(tata > 0 && H[tata].info > value)
    {
        H[fiu] = H[tata];
        poz[H[tata].nr] = fiu;
        fiu = tata;
        tata = tata/2;
    }
    H[fiu].info = value;
    H[fiu].nr = intro;
    poz[intro] = fiu;
}

void combinare(int startposition)
{
    heap node = H[startposition];
    int fiu, tata;
    tata = startposition;
    fiu = 2 * startposition;
    while(fiu <= n)
    {
        if(fiu <= n && H[fiu].info >= H[fiu + 1].info)
            ++fiu;
        if(H[fiu].info < node.info)
        {
            H[tata] = H[fiu];
            poz[H[fiu].nr] = tata;
            tata = fiu;
            fiu = 2 * tata;
        }
    }
    H[tata] = node;
    poz[H[tata].nr] = tata;
}

int main()
{
    int i;
    fin = freopen("heapuri.in", "r", stdin);
    fscanf(fin, "%d", &nrop);
    for(i = 1; i <= nrop; i++)
    {
        fscanf(fin, "%d", &caz);
        if(caz == 3)
        {
            fout << H[1].info << '\n';
        }
        else
        {
            fscanf(fin, "%d", &x);
            if(caz == 1)
            {
                inserare(x);
            }
            else
            {
                H[poz[x]] = H[n];
                --n;
                poz[H[poz[x]].nr] = x;
                combinare(poz[x]);
            }
        }
    }
    return 0;
}
/*
#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);
}
*/