Pagini recente » Cod sursa (job #1672363) | Cod sursa (job #3211111) | Cod sursa (job #2965200) | Cod sursa (job #2298073) | Cod sursa (job #716822)
Cod sursa(job #716822)
#include <stdio.h>
#define FI fopen("heapuri.in","r")
#define FO fopen("heapuri.out","w")
struct Heap {
long nr;
long cronoPoz;
} heap[2000002];
long heapSize,crono[200001],cronoLen;
void heapAdd(long nr) {
Heap aux;
long i;
i=heapSize;
heap[heapSize].nr=nr;
heap[heapSize].cronoPoz=cronoLen;
crono[cronoLen]=heapSize;
cronoLen++;
heapSize++;
while(i>1 && heap[i].nr<heap[i/2].nr) {
aux=heap[i];heap[i]=heap[i/2];heap[i/2]=aux;
crono[heap[i].cronoPoz]=i;
i/=2;
crono[heap[i].cronoPoz]=i;
}
}
void heapRemove(long cronoPoz) {
Heap aux;
long i;
i=crono[cronoPoz];
crono[cronoPoz]=0;
heapSize--;
heap[i]=heap[heapSize];
crono[heap[i].cronoPoz]=i;
while(2*i<heapSize && (heap[i].nr> heap[i*2].nr || heap[i].nr > heap[i*2+1].nr))
if(2*i+1<heapSize && heap[i*2].nr>heap[i*2+1].nr) {
aux=heap[i];heap[i]=heap[i*2+1];heap[i*2+1]=aux;
crono[heap[i].cronoPoz]=i;
i+=i+1;
crono[heap[i].cronoPoz]=i;
}
else
if(2*i<heapSize) {
aux=heap[i];heap[i]=heap[i*2];heap[i*2]=aux;
crono[heap[i].cronoPoz]=i;
i+=i;
crono[heap[i].cronoPoz]=i;
}
}
long heapFront() {
return heap[1].nr;
}
int main() {
long i,n,c,x;
FILE *fi=FI,*fo=FO;
fscanf(fi,"%li",&n);
cronoLen=1;
heapSize=1;
for(i=1;i<=n;i++) {
fscanf(fi,"%li",&c);
switch(c) {
case 1: //insereaza x
fscanf(fi,"%li",&x);
heapAdd(x);
break;
case 2: //sterge cronologic x
fscanf(fi,"%li",&x);
heapRemove(x);
break;
case 3: //minimul
fprintf(fo,"%li\n",heapFront());
break;
}
}
return 0;
}