Cod sursa(job #917044)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 17 martie 2013 10:31:29
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <stdio.h>
#define MAX_N 200000
using namespace std;
int N,SW,ACN,U;
int Heap[MAX_N],Pos[MAX_N],PosHeap[MAX_N];
void Swap(int a,int b)
{
    int aux=Heap[a];
    Heap[a]=Heap[b];
    Heap[b]=aux;
    aux=PosHeap[a];
    PosHeap[a]=PosHeap[b];
    PosHeap[b]=aux;
    aux=Pos[PosHeap[a]];
    Pos[PosHeap[a]]=Pos[PosHeap[b]];
    Pos[PosHeap[b]]=aux;
}
void Up(int nod){
    int father=nod/2;
    U=nod;
    if(nod<=1||Heap[father]<Heap[nod])
        return;
    SW=1;
    Swap(father,nod);
    Up(father);
}
int ReturnMinSon(int father)
{
    int left=2*father;
    int right=2*father+1;
    if(right>ACN)
        return left;
    if(Heap[left]<Heap[right])
        return left;
    return right;
}
void Down(int nod){
    U=nod;
    if(2*nod>ACN)
        return;
    int son=ReturnMinSon(nod);
    if(Heap[son]<Heap[nod])
    {
        SW=1;
        Swap(son,nod);
        Down(son);
    }
}
void Add(int nod,int nr){
    ACN++;
    Heap[nod]=nr;
    Pos[nod]=nod;
    PosHeap[nod]=nod;
    Up(nod);
}
void Delete(int nr)
{
    int nod=Pos[nr];
//    printf("intrat:%d\n",nr);
    Heap[nod]=Heap[ACN];
    PosHeap[nod]=PosHeap[ACN];
    Pos[PosHeap[nod]]=nod;
    SW=0;
    ACN--;

    Up(nod);
    if(SW==0)
    {

        Down(nod);
    }
}
void Read()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d\n",&N);
    int i,sw,nr;
    for(i=1;i<=N;i++){
        scanf("%d ",&sw);
        if(sw==1)
        {
            scanf("%d\n",&nr);
            Add(ACN+1,nr);
        }
        else if(sw==2)
        {
            scanf("%d\n",&nr);
            Delete(nr);
        }
        else
            printf("%d\n",Heap[1]);
    }
    fclose(stdin);
    fclose(stdout);
}
int main()
{
    Read();
    return 0;
}