Cod sursa(job #1129692)

Utilizator obidanDan Ganea obidan Data 28 februarie 2014 04:30:31
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include <cstdio>
#include <algorithm>
using namespace std;
inline int left(int i) { return (i<<1); }
inline int right(int i) {return (i<<1)+1; }
inline int dad(int i) {return (i>>1);}
int a[100002],time[100002],v[100002],heapsize=0;
int t=1;
// Vectorul a este heapul
// time[i] reprezinta al i-lea element intrat cronologic
// v[i]= pozitia elementului in in heap
// v[a[i]] pozitia elementului i din heap
// Atunci cand apelex heapify, interschimb elementele din heap dar si pozitiile acestora, adica pozitiile reprezentate de valoarea elementelor heapului.
//a[v[t[x]]] reprezinta -> t[x] al x-lea element cronologic
// y[t[x]] reprezinta pozitia in heap al al x-lea element cronologic
// a[y[t[x]]] reprezinta valoarea in heap a elementului de pe pozitia al x-lea cronologic
void heapify(int x)
{
   int l=left(x),r=right(x),minim;
    if((l<=heapsize)&&(a[l]<a[x]))
    {
        minim=l;
    }
    else
        minim=x;
    if((r<=heapsize) &&(a[r]<a[minim]))
    {
        minim=r;
    }
    if(minim!=x)
    {
        swap(a[x],a[minim]);
        swap(v[a[x]],v[a[minim]]);
        heapify(minim);
    }
}
void percolate(int x)
{
    int cheie;
    cheie=a[x];
    while((x>1)&&(cheie<a[dad(x)]))
    {
        v[a[dad(x)]]=x; // <- shitfag
        a[x]=a[dad(x)];
        x=dad(x);
    }
    a[x]=cheie;
    v[cheie]=x;


}
void Insert(int x)
{
    heapsize++;
    a[heapsize]=x;
    v[x]=heapsize;
   percolate(heapsize);

}
int extractMin()
{
    printf("%d\n",a[1]);
}
void Delete(int x)
{
    int parinte;
    a[ v [ time[x] ] ]=a[heapsize];
    heapsize--;
    if(heapsize>1)
    {
        parinte=dad(a[v[time[x]]]);
        if(parinte>a[v[time[x]]])
        {
            percolate(v[time[x]]);
        }
        else
        {
            heapify(v[time[x]]);
        }
    }
}
int main()
{
    int i,x,n,c;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&c);
        if((c==1)||(c==2))
        {
            scanf("%d",&x);
            if(c==1)
            {
                time[t++]=x;
                Insert(x);
            }
            else
            {
                Delete(x);
            }
        }
        else
        {
            extractMin();
        }
    }

}