Cod sursa(job #1362852)

Utilizator firutibogdanFiruti Bogdan-Cristian firutibogdan Data 26 februarie 2015 16:03:09
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<cstdio>
using namespace std;
struct pereche
{
  int poz,val;
};
pereche heap[200002],v[200002];
int n,a,c,x,nrelem,i,vmin;
void adaug(int  c,int x,int &i)
{
    nrelem++;
    // urcarea
    i=nrelem;
    while(i/2>0 && heap[i/2].val>x)
    {
        heap[i]=heap[i/2];
        v[heap[i/2].poz].poz=i;
        i=i/2;
    }
    heap[i].poz=c;
    heap[i].val=x;
}
void sterg(int x)
{
    int p,pmin,vmin;
    p=v[x].poz;
    while(p*2<=nrelem)
    {
        vmin=heap[p*2].val;
        pmin=2*p;
        if(2*p+1<=nrelem && heap[2*p+1].val<vmin)
        {
            vmin=heap[2*p+1].val;
            pmin=2*p+1;
        }
        if(vmin<heap[nrelem].val)
        {
            heap[p]=heap[pmin];
            v[heap[p].poz].poz=p;
            p=pmin;
        }
        else
        {
            heap[p]=heap[nrelem];
            v[heap[p].poz].poz=p;
            nrelem--;
            break;
        }
    }
}
int minim()
{
    return heap[1].val;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");
    fscanf(fin,"%d",&n);
    c=0;
    nrelem=0;
    for(i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&a);
        if(a==1)
        {
            fscanf(fin,"%d",&x);
            c++;
            v[c].val=x;
            adaug(c,x,v[c].poz);
        }
        if(a==2)
        {
            fscanf(fin,"%d",&x);
            sterg(x);
        }
        if(a==3)
        {
            //vmin=minim();
            vmin=heap[1].val;
            fprintf(fout,"%d\n",vmin);
        }
    }

    fclose(fin);
    fclose(fout);
    return 0;
}