Pagini recente » Cod sursa (job #2324623) | Cod sursa (job #324135) | Cod sursa (job #2678785) | Cod sursa (job #2971261) | Cod sursa (job #3185106)
#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,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]);
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;
}