Pagini recente » Cod sursa (job #324331) | Cod sursa (job #2280589) | Cod sursa (job #1569846) | Cod sursa (job #2040641) | Cod sursa (job #970570)
Cod sursa(job #970570)
#include<stdio.h>
#include<stdlib.h>
struct Node {
int value;
int ord;
};
class MinHeap{
public:
struct Node *H;
int Dcurr, Dmax;
int *poz, nro;
//vector in care retin la indicele i(corespunzator ordinii citirii elementului din fisier) pozitia pe care o ocupa in H
MinHeap(int maxDim){
this->Dmax = maxDim;
H = new Node[this->Dmax + 1];
poz = new int[this->Dmax + 1];
Dcurr = 0;
nro = 0;
}
void Insert(int x){
struct Node elem;
Dcurr++;
nro++;
elem.value = x;
elem.ord = nro;
H[Dcurr] = elem;
poz[nro] = Dcurr;
pushUp(Dcurr);
}
int retMin(){
return H[1].value;
}
void extractOrd(int entr){
int paux;
H[poz[entr]] = H[Dcurr];
paux = poz[entr];
poz[entr] = poz[H[Dcurr].ord];
poz[H[Dcurr].ord] = paux;
poz[entr] = 0;
Dcurr--;
pushUp(paux);
heapify(paux);
}
void pushUp(int l){
int parent;
int paux;
struct Node vaux;
parent = l/2;
while(l > 1 && H[parent].value > H[l].value){
paux = poz[H[parent].ord];
poz[H[parent].ord] = poz[H[l].ord];
poz[H[l].ord] = paux;
vaux = H[parent];
H[parent] = H[l];
H[l] = vaux;
l = parent;
parent = l/2;
}
}
void heapify(int l){
int left, right, m;
int paux;
struct Node vaux;
left = 2*l;
right = left + 1;
if((left <= Dcurr && H[left].value < H[l].value) && H[left].value < H[right].value)
m = left;
else
if((right <= Dcurr && H[right].value < H[l].value) && H[right].value < H[left].value)
m = right;
else
m = l;
if(m != l){
paux = poz[H[l].ord];
poz[H[l].ord] = poz[H[m].ord];
poz[H[m].ord] = paux;
vaux = H[l];
H[l] = H[m];
H[m] = vaux;
heapify(m);
}
}
void print(){
int i;
for(i=1; i<=Dcurr; i++)
printf("%d ", H[i].value);
printf("\n");
for(i=1; i<=nro; i++)
printf("%d ", poz[i]);
printf("\n");
}
};
int main(){
int info, ent, code, N, i, ord = 0, min;
class MinHeap hp(1000000);
FILE *pf, *pg;
pf = fopen("heapuri.in", "r");
pg = fopen("heapuri.out", "w");
fscanf(pf, "%d", &N);
for(i=1; i<=N; i++){
fscanf(pf, "%d", &code);
if(code == 1){
fscanf(pf, "%d", &info);
hp.Insert(info);
}
else
if(code == 2){
fscanf(pf, "%d", &ent);
hp.extractOrd(ent);
}
else
if(code == 3){
min = hp.retMin();
fprintf(pg, "%d\n", min);
}
}
fclose(pf);
fclose(pg);
return 0;
}