Pagini recente » Cod sursa (job #19368) | Cod sursa (job #2619343) | Cod sursa (job #2543312) | Cod sursa (job #1807244) | Cod sursa (job #1861785)
#include<stdio.h>
int heap[200011];
int N;// dim heap
int v[200011];
int poz[200011];
int parent(int k){
return k/2;
}
int kid1 (int k){
return 2*k ;
}
int kid2 (int k){
return 2*k + 1;
}
int min_heap(){
return v[heap[1]];
}
void promoveaza (int k){
int aux = heap[k];
while ( k > 1 && v[aux] < v[heap[parent(k)]]){
heap[k] = heap[parent(k)];
poz[heap[parent(k)]] = k;
k = parent(k);
}
heap[k] = aux;
poz[aux] = k;
}
void cerne (int k){
int kid,aux;
do {
kid = 0;
// Alege un fiu mai mare ca tatal.
if (kid1(k) <= N) {
kid = kid1(k);
if (kid2(k) <= N && v[heap[kid2(k)]] < v[heap[kid1(k)]])
kid = kid2(k);
if (v[heap[kid]] >= v[heap[k]])
kid = 0;
}
if (kid != 0) {
aux = heap[k]; heap[k] = heap[kid]; heap[kid] = aux;
aux = poz[heap[k]]; poz[heap[k]] = poz[heap[kid]]; poz[heap[kid]] = aux;
k = kid;
}
} while (kid != 0);
}
void insert_heap (int k){
promoveaza(k);
}
void cut(int k){
promoveaza (k);
cerne (k);
}
int main (){
FILE *in,*out;
in = fopen ("heapuri.in","r");
out = fopen ("heapuri.out","w");
int m,i,x,n,cod;
fscanf(in,"%d",&m);
n = 0;// elem vector
for (i=1;i<=m;i++){
fscanf(in,"%d",&cod);
if (cod <= 2){
fscanf(in,"%d",&x);
if (cod == 1){
n ++;N++;
v[n] = x;
heap[N] = n;
poz[n] = N;
insert_heap (N);
}
else {// cod == 3
heap [poz[x]] = heap[N];// pun ultimul elem din heap pe poz elementului de scos
poz[heap [poz[x]]] = poz[x];// updatez noua poz
N --;
if (poz[x] <= N)
cut (poz[x]);
}
}// cod <=2
else {//cod == 3
fprintf (out,"%d\n",min_heap());//returneaza rad heap-ului (val minimia)
}
}// for
fclose (in);
fclose (out);
return 0;
}