Cod sursa(job #1354778)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 21 februarie 2015 23:59:37
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.91 kb
#include<stdio.h>
struct pereche
{
  int poz,val;
};
pereche heap[200002],v[200002];
int n,a,c,x,nrelem,i,vmin;

inline 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].poz].poz=i;
        i=i/2;
    }
    heap[i].poz=c;
    heap[i].val=x;
}
inline void sterg(int x)
{
    int p,pmin,vmin;
    pereche aux;
    p=v[x].poz;
    heap[p]=heap[nrelem];
    v[heap[p].poz].poz=p;
    nrelem--;
    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[p].val)
        {
            aux=heap[p];
            heap[p]=heap[pmin];
            v[heap[p].poz].poz=p;
            heap[pmin]=aux;
            v[heap[pmin].poz].poz=pmin;
            p=pmin;
        }
        else
        {
            break;
        }
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    c=0;
    nrelem=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a);
        if(a==1)
        {
            scanf("%d",&x);
            c++;
            v[c].val=x;
            adaug(c,x,v[c].poz);
        }
        if(a==2)
        {
            scanf("%d",&x);
            sterg(x);
        }
        if(a==3)
        {
            printf("%d\n",heap[1].val);
        }
    }

    return 0;
}


/*
#include<stdio.h>

int v[200002], pv[200002];
int H[200002], pH, pH1, q, nH;
int n,a,c,x,i;

void adaug(int poz)
{
    int i,p,x;
    x=v[poz];
    nH++;
    // urcarea
    i=nH;
    p=(i>>1);
    pH=H[p];
    while(p && v[pH]>x)
    {
        H[i]=pH;
        pv[pH]=i;
        i=p;
        p=(i>>1);
        pH=H[p];
    }
    H[i]=poz;
    pv[poz]=i;
}
void sterg(int poz)
{
    int p,i;
    v[poz]=-1;
    q=H[nH];
    nH--;
    p=pv[poz];
    while((p<<1)<=nH)
    {
        i=(p<<1);
        pH=H[i];
        pH1=H[i+1];
        if(i+1<=nH && v[pH1]<v[pH])
        {
            pH=pH1;
            i++;
        }
        if(v[pH]<v[q])
        {
            H[p]=pH;
            pv[pH]=p;
            p=i;
        }
        else break;
    }
    H[p]=q;
    pv[q]=p;
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    c=0;
    nH=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a);
        if(a==1)
        {
            scanf("%d",&x);
            c++;
            v[c]=x;
            adaug(c);
        }else
        if(a==2)
        {
            scanf("%d",&x);
            sterg(x);
        }else
        {
            printf("%d\n",v[H[1]]);
        }
    }

    fclose(stdout);
    fclose(stdin);
    return 0;
}
*/