Cod sursa(job #1577142)

Utilizator raztaapDumitru raztaap Data 23 ianuarie 2016 11:43:28
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 3.6 kb
#include <cstdio>
#define MAXN 200100
struct elem{int inf; int nr;};
elem H[MAXN];
int poz[MAXN];
int n, nrop;
void inserare(int inf, int timp)                  //O(n)=log2(n)
{
    int fiu, tata;
    fiu=++n;
    tata=fiu/2;
    while(tata>0&& H[tata].inf>inf)
    {
        H[fiu]=H[tata];
        poz[H[tata].nr]=fiu;
        fiu=tata;
        tata=tata/2;
    }
    H[fiu].inf=inf;
    H[fiu].nr=timp;
}

void combinare(int i)
{
    int inf=H[i].inf, timp=H[i].nr, tata, fiu;
    tata=i; fiu=2*i;
    while(fiu<=n)                               //cat timp mai exista fii
    {
        if(fiu+1<=n&&H[fiu].inf>H[fiu+1].inf) fiu++;
                                                //fiu indica cel mai mic dintre fii
        if(H[fiu].inf<=inf)                         //daca cel mai mic este mai mic decat inf
        {
                                                    //promovez pe cel mai mic dintre fii
            H[tata]=H[fiu];
            poz[H[fiu].nr]=tata;
            tata=fiu;
            fiu=2*tata;
        }
        else                                    //am gasit locul
            break;
    }
    H[tata].inf=inf;
    H[tata].nr=timp;
    poz[timp]=tata;
}
void rezolva_problema()
{
    int i, x, y, t=0,j;
    scanf("%d", &nrop);
    for(i=1;i<=nrop;++i)
    {
        scanf("%d", &x);
        if(x==1)
        {
            scanf("%d", &y);
            H[++n].inf=y;
            ++t;
            H[n].nr=t;
            poz[t]=n;
            for(j=n/2;j>0;--j) combinare(j);
        }
        else
            if(x==2)
            {
                scanf("%d", &y);
                H[poz[y]]=H[n--];
                combinare(poz[y]);
            }
            else
                printf("%d\n", H[1].inf);
    }
}
int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    rezolva_problema();
    return 0;
}
/*#include <fstream>
#define DMAX 1000
using namespace std;
int H[DMAX];
int n;
ofstream fout("heap.out");
void inserare(int inf);
void creare_inserare();
void combinare(int i);
void creare_combinari();
int extrage_min();
void heapsort();

int main()
{
    int i;
    creare_combinari();
    for(i=1;i<=n;++i) fout<<H[i]<<' ';
    fout<<endl;
    return 0;
}

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

void creare_inserare()
{
    int nr, i,x;
    ifstream fin("heap.in");
    fin>>nr;
    for(i=1;i<=nr;++i)
    {
        fin>>x;
        inserare(x);
    }
}

void combinare(int i)
{
    int inf=H[i], tata, fiu;
    tata=i; fiu=2*i;
    while(fiu<=n)                               //cat timp mai exista fii
    {
        if(fiu+1<=n&&H[fiu]>H[fiu+1]) fiu++;
                                                //fiu indica cel mai mic dintre fii
        if(H[fiu]<=inf)                         //daca cel mai mic este mai mic decat inf
        {                                       //promovez pe cel mai mic dintre fii
            H[tata]=H[fiu];
            tata=fiu;
            fiu=2*tata;
        }
        else                                    //am gasit locul
            break;
    }
    H[tata]=inf;
}

void creare_combinari()
{   int i;
    ifstream fin("heap.in");
    fin>>n;
    for(i=1;i<=n;++i) fin>>H[i];
    for(i=n/2;i>0;--i)
        combinare(i);
}

int extrage_min()
{
    int x=H[1];
    H[1]=H[n--];
    combinare(1);
    return x;
}*/