Cod sursa(job #1795128)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 1 noiembrie 2016 23:57:35
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#define MAXN 200000
int v[MAXN],heap[MAXN+1],poz[MAXN],l,k;
inline void swap(int a,int b)
{
    int aux=heap[a];
    heap[a]=heap[b];
    heap[b]=aux;
    poz[heap[a]]=a;
    poz[heap[b]]=b;
}
inline void up(int p)
{
    while(p/2 && v[heap[p]]<v[heap[p/2]])
    {
        swap(p,p/2);
        p/=2;
    }
}
inline void down(int p)
{
    int y=p;
    char ok=1;
    while(ok && 2*p<=l)
    {
        ok=0;y=p;
        if(v[heap[p]]>v[heap[2*p]])
            p=2*p,ok=1;
        if(2*y<l && v[heap[p]]>v[heap[2*y+1]])
            p=2*y+1,ok=1;
        if(ok)
            swap(p,y);
    }
}
inline void add(int x)
{
    v[k]=x;poz[k]=++l;
    heap[l]=k;k++;
    up(l);
}
inline void pop(int x)
{
    heap[poz[x]]=heap[l];
    poz[heap[l--]]=poz[x];
    if(poz[x]/2 && v[heap[poz[x]]]<v[heap[poz[x]/2]])
        up(poz[x]);
    else
        down(poz[x]);
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");
    int n,i,cod,x;
    fscanf(fin,"%d",&n);
    for(i=0;i<n;i++)
    {
        fscanf(fin,"%d",&cod);
        if(cod==3)
            fprintf(fout,"%d\n",v[heap[1]]);
        else
        {
            fscanf(fin,"%d",&x);
            if(cod==1)
                add(x);
            else
                pop(x-1);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}