Cod sursa(job #3185108)

Utilizator razviOKPopan Razvan Calin razviOK Data 17 decembrie 2023 23:03:40
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int key;
    int num_entry;
};
void Heapify(int heapSize,Node *heap,int index,int *arr_index){

    Node aux;
    while(index<=heapSize/2){
        if(heap[index].key<=heap[index*2].key && (index*2+1>heapSize || heap[index].key<=heap[index*2+1].key))
            break;
        else if(heap[index*2].key<=heap[index].key && (index*2+1>heapSize || heap[index*2].key<=heap[index*2+1].key)){
            arr_index[heap[index].num_entry]=index*2;
            arr_index[heap[index*2].num_entry]=index;
            aux=heap[index];
            heap[index]=heap[index*2];
            heap[index*2]=aux;
            index<<=1;
        }
        else{
            arr_index[heap[index].num_entry]=index*2+1;
            arr_index[heap[index*2+1].num_entry]=index;
            aux=heap[index];
            heap[index]=heap[index*2+1];
            heap[index*2+1]=aux;
            index<<=1;
            index++;
        }
    }
}
void UpHeap(int heapSize,Node *heap,int index,int *arr_index){

    Node aux;
    while(index>1 && heap[index].key<heap[index/2].key){
        arr_index[heap[index].num_entry]=index/2;
        arr_index[heap[index/2].num_entry]=index;
        aux=heap[index];
        heap[index]=heap[index/2];
        heap[index/2]=aux;
        index>>=1;
    }

}
void InsertInHeap(int *heapSize,Node *heap,int key,int num_entry,int *arr_index){
  heap[++(*heapSize)].key=key;
  heap[(*heapSize)].num_entry=num_entry;
  arr_index[num_entry]=(*heapSize);
  UpHeap(*heapSize,heap,*heapSize,arr_index);
}
void DeleteInHeap(int *heapSize,Node *heap,int num_entry,int *arr_index){

    heap[arr_index[num_entry]]=heap[(*heapSize)];
    arr_index[heap[(*heapSize)].num_entry]=arr_index[num_entry];
    (*heapSize)--;
    UpHeap((*heapSize),heap,arr_index[num_entry],arr_index);
    Heapify((*heapSize),heap,arr_index[num_entry],arr_index);
}
int main() {

    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int n;
    scanf("%d",&n);
    int cnt=0,op,x,heapSize=0;
    Node *heap=(Node *) malloc(sizeof(Node)*(n+1));
    int *arr_ind=(int *) malloc(sizeof(int)*(n+1));

    for(int i=0;i<n;i++){
        scanf("%d",&op);
        if(op==3) printf("%d\n",heap[1].key);
        else{
            scanf("%d",&x);
            if(op==1) {
                cnt+=1;
                InsertInHeap(&heapSize, heap, x, cnt, arr_ind);
            }
            else DeleteInHeap(&heapSize,heap,x,arr_ind);
        }
    }

    free(heap);
    free(arr_ind);
    return 0;
}