Pagini recente » Cod sursa (job #1083718) | Cod sursa (job #749042) | Cod sursa (job #840536) | Cod sursa (job #2720758) | Cod sursa (job #251378)
Cod sursa(job #251378)
#include<stdio.h>
#define MAX 200003
FILE*f=fopen("heap.in","r");
FILE*g=fopen("heap.out","w");
int H[MAX], A[MAX], Poz[MAX];
int N, NR;
// Pos[i] - pozitia nodului i, in H[]
void insert(int x) //Inserez x in heap
{
int aux;
N++;
Poz[++NR]=x; // x intra al NR-lea in multime
H[N]=x;
int T=N/2;
int K=N;
while(K>1 && ( H[K] < H[T]))
{
aux=H[K]; H[K]=H[T]; H[T]=aux;
K=K/2;
T=K/2;
}
}
void del(int x) // Sterg elementul intrat al x-lea in multime<=>Sterg Poz[x]
{
int i,K,aux;
for(i=1;i<=N;++i) if(H[i] == Poz[x]) {K=i; break;} //caut pozitia lui poz[x] in H
// elementul care trebuie sters se gaseste in nodul K in heap
H[K] = H[N];
--N;
Poz[x] = -1;
int fiu;
do
{
fiu=0;
if(2*K <= N && H[K] > H[2*K]) fiu=2*K;
if(2*K+1<=N && H[2*K]>H[2*K+1]) fiu=2*K+1;
if(H[fiu] >= H[K]) fiu=0;
if(fiu)
{
aux = H[fiu];
H[fiu]= H[K];
H[K] = aux;
K=fiu;
}
}
while(fiu);
}
int main()
{
int n;
fscanf(f,"%d",&n);
int cod,x;
while(n--)
{
fscanf(f,"%d",&cod);
if(cod<3)
{
fscanf(f,"%d",&x);
if(cod==1)
{
insert(x);
}
else del(x);
}
else
fprintf(g,"%d\n",H[1]);
}
return 0;
}