Cod sursa(job #2503705)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 3 decembrie 2019 18:10:33
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <stdio.h>

using namespace std;
FILE *in,*out;

int heap[200002],pos[200002],order[200002];

int n,nr,hm;

void sift(int k){
    int key=heap[k],pey=order[k],son;
    do{
        son=0;
        if(k*2<=nr && key>heap[k*2]){
            son=k*2;
            if(k*2+1<=nr && heap[k*2]>heap[k*2+1])
                son=k*2+1;
        }
        if(son){
            heap[k]=heap[son];
            order[k]=order[son];
            pos[order[k]]=k;
            heap[son]=key;
            order[son]=pey;
            pos[order[son]]=son;
        }
    }while(son);
}

void percolate(int k){
    int key=heap[k],pey=order[k];
    while(k>1 && key<heap[k/2]){
        heap[k]=heap[k/2];
        pos[order[k/2]]=k;
        order[k]=order[k/2];
        k=k/2;
    }
    heap[k]=key;
    order[k]=pey;
    pos[order[k]]=k;
}

void insert_heap(int node){
    heap[++nr]=node;
    hm++;
    pos[hm]=nr;//pozitia elemntului intrat al hm-lea
    order[nr]=hm;//elementul de pe pozitia nr a intrat al hm-lea
    percolate(nr);
}

void cut(int x){
    heap[pos[x]]=heap[nr];
    order[pos[x]]=order[nr];
    pos[order[nr]]=x;
    nr--;

    if(pos[x]>1 && heap[pos[x]]<heap[pos[x]]/2)
        percolate(pos[x]);
    else
        sift(pos[x]);
}

void read(){
    int code,node,x;
    fscanf(in,"%d",&n);
    for(int i=0;i<n;i++){
        fscanf(in,"%d",&code);
        if(code==1)
            fscanf(in,"%d",&node),insert_heap(node);
        else if(code==2)
            fscanf(in,"%d",&x),cut(x);
        else
            fprintf(out,"%d\n",heap[1]);
    }
}

int main(){
    in=fopen("heapuri.in","r");
    out=fopen("heapuri.out","w");
    read();
    /*fprintf(out,"\n");
    int j=1,m=1,p2=1;
    for(int i=1;i<=3;i++,p2*=2,fprintf(out,"\n"))
        for(m=1,j;j<=nr && m<=p2;j++,m++)
            fprintf(out,"%d ",heap[j]);
    */
    return 0;
}