Cod sursa(job #2503745)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 3 decembrie 2019 18:44:30
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 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] && key>heap[k*2+1])
            son=k*2+1;
        if(son && key>heap[son]){
            heap[k]=heap[son];
            order[k]=order[son];
            pos[order[son]]=k;
            k=son;
        }
    }while(son);
    heap[k]=key;
    order[k]=pey;
    pos[order[k]]=k;
}

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];
    pos[order[nr]]=pos[x];
    order[pos[x]]=order[nr];
    nr--;
    percolate(pos[x]);
    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<=50;i++,p2*=2,fprintf(out,"\n"))
        for(m=1,j;j<=nr && m<=p2;j++,m++)
            fprintf(out,"%d ",heap[j]);*/

    return 0;
}