Cod sursa(job #1258775)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 9 noiembrie 2014 13:48:34
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.61 kb
#include<stdio.h>
#define N 200000
int v[N],poz[N],heap[N];
inline int left(int i){
    return i*2+1;
}
inline int right(int i){
    return i*2+2;
}
inline int parent(int i){
    if(i!=0)
        return (i-1)/2;
    return -1;
}
inline void swap(int i,int j){
    int aux=heap[i];
    heap[i]=heap[j];
    heap[j]=aux;
    poz[heap[i]]=i;
    poz[heap[j]]=j;
}
void insert(int i){
    while(parent(i)!=-1&&v[heap[parent(i)]]>=v[heap[i]]){
        swap(i,parent(i));
        i=parent(i);
    }
}
void pop(int x,int hSize){
    int y=-1;
    while(x!=y){
        y=x;
        if(left(y)<hSize&&v[heap[x]]>v[heap[left(y)]])
            x=left(y);
        if(right(y)<hSize&&v[heap[x]]>v[heap[right(y)]])
            x=right(y);
        swap(x,y);
    }
}
int main(){
    FILE *fin,*fout;
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");
    int n;
    fscanf(fin,"%d",&n);
    int i,nr=0,length=0;
    for(i=0;i<n;i++){
        int op,x;
        if(i==34)
            i++,i--;
        fscanf(fin,"%d",&op);
        if(op==1){
            fscanf(fin,"%d",&v[nr]);
            heap[length]=nr;
            poz[nr++]=length++;
            insert(length-1);
        }
        else if(op==2){
                fscanf(fin,"%d",&x);
                v[x-1]=-1;
                insert(poz[x-1]);
                poz[heap[0]]=-1;
                heap[0]=heap[--length];
                poz[heap[0]]=0;
                if(length>=1)
                    pop(0,length);
            }
            else
                fprintf(fout,"%d\n",v[heap[0]]);
    }
    return 0;
}