Pagini recente » Cod sursa (job #1849228) | Cod sursa (job #1040754) | Cod sursa (job #2949449) | Cod sursa (job #3176285) | Cod sursa (job #3231520)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void inserare(int heap[],int x,int i,int crono[], int poz[], int nr_citite){
int aux,ok=1;
heap[i]=x;
crono[nr_citite]=i;
poz[i]=nr_citite;
do{
if(heap[i]<heap[i/2]){
aux=heap[i/2];
heap[i/2]=heap[i];
heap[i]=aux;
crono[nr_citite]=i/2;
crono[poz[i/2]]=i;
aux=poz[i/2];
poz[i/2]=crono[nr_citite];
poz[i]=aux;
ok=0;
i=i/2;
}
else
ok=1;
}while(i!=1 && ok==0);
}
int stergere(int heap[], int x,int crono[]){
int j=crono[x];
while((2*j+1)<200000 && heap[2*j]!=-1 && heap[2*j+1]!=-1){
if(heap[2*j] < heap[2*j+1]){
heap[j]=heap[2*j];
j=2*j;
}
else{
heap[j]=heap[2*j+1];
j=2*j+1;
}
}
if((2*j)<200000 && heap[2*j]!=-1){
heap[j]=heap[2*j];
j=2*j;
}
return j;
}
int main(){
int heap[200000],i=1,n,k,x,nr_citite=1;
int crono[200000];//indexul e ordinea cronologica
int poz[200000]; //indexul este pozitia
FILE *f, *g;
if((f=fopen("heapuri.in","r"))==NULL){
printf("eroare deschidere fisier\n");
exit(1);
}
if((g=fopen("heapuri.out","w"))==NULL){
printf("eroare deschidere fisier\n");
exit(1);
}
fscanf(f,"%d",&n);
memset(heap,-1,n*sizeof(int));
for(int j=0;j<n;j++){
fscanf(f,"%d",&k);
switch(k){
case 1:
fscanf(f,"%d",&x);
inserare(heap,x,i,crono,poz,nr_citite);
i++;
nr_citite++;
break;
case 2:
fscanf(f,"%d",&x);
i=stergere(heap,x,crono);
break;
case 3:
fprintf(g,"%d\n",heap[1]);
break;
}
}
fclose(f);
fclose(g);
return 0;
}