Cod sursa(job #1787566)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 24 octombrie 2016 20:00:01
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
using namespace std;

#define nr_max 200010
int a[nr_max],idx_h[nr_max],idx_inp[nr_max],n=0;

void add(int x)
{
    a[++n]=x;
    idx_h[n]=n;
    idx_inp[n]=n;
    int i=n,aux;//i=nodul curent
    while(i/2 && a[i]<a[i/2])
    {
        aux=a[i];a[i]=a[i/2];a[i/2]=aux;
        aux=idx_h[i];idx_h[i]=idx_h[i/2];idx_h[i/2]=aux;
        aux=idx_inp[idx_h[i]];idx_inp[idx_h[i]]=idx_inp[idx_h[i/2]];idx_inp[idx_h[i/2]]=aux;
        i/=2;
    }
}

void del(int ind)
{
    int fiu,aux;
    aux=a[ind];a[ind]=a[n];a[n]=aux;
    aux=idx_h[ind];idx_h[ind]=idx_h[n];idx_h[n]=aux;
    aux=idx_inp[idx_h[ind]];idx_inp[idx_h[ind]]=idx_inp[idx_h[n]];idx_inp[idx_h[n]]=aux;
    --n;
    //verific daca tre' sa urc sau sa cobor
    if(ind/2 && a[ind]<a[ind/2])
    {
        while(ind/2 && a[ind]<a[ind/2])
        {
        aux=a[ind];a[ind]=a[ind/2];a[ind/2]=aux;
        aux=idx_h[ind];idx_h[ind]=idx_h[ind/2];idx_h[ind/2]=aux;
        aux=idx_inp[idx_h[ind]];idx_inp[idx_h[ind]]=idx_inp[idx_h[ind/2]];idx_inp[idx_h[ind/2]]=aux;
        ind/=2;
        }
        return;
    }
    while(1)
    {
        fiu=2*ind;
        if(fiu>n)break;
        if(fiu+1<=n && a[fiu]>a[fiu+1])++fiu;
        if(a[ind]<=a[fiu])break;
        aux=a[ind];a[ind]=a[fiu];a[fiu]=aux;
        aux=idx_h[ind];idx_h[ind]=idx_h[fiu];idx_h[fiu]=aux;
        aux=idx_inp[idx_h[ind]];idx_inp[idx_h[ind]]=idx_inp[idx_h[fiu]];idx_inp[idx_h[fiu]]=aux;
        ind=fiu;
    }
}

int main()
{
    FILE *f=fopen("heapuri.in","r"),
         *g=fopen("heapuri.out","w");
    int n,i,op,x;
    fscanf(f,"%d",&n);
    for(i=1;i<=n;++i)
    {
        fscanf(f,"%d",&op);
        if(op==1)
        {
            fscanf(f,"%d",&x);
            add(x);
        }
        if(op==2)
        {
            fscanf(f,"%d",&x);
            del(idx_inp[x]);
        }
        if(op==3)
            fprintf(g,"%d\n",a[1]);
    }
    return 0;
}