Pagini recente » Cod sursa (job #2946868) | Cod sursa (job #2649303) | Cod sursa (job #2208653) | Cod sursa (job #2155845) | Cod sursa (job #601570)
Cod sursa(job #601570)
#include<fstream>
#include<iostream>
#include<cstdio>
using namespace std;
FILE *in=fopen("heapuri.in","r");
FILE *out=fopen("heapuri.out","w");
int ord[10000],poz_ord[10000],nr;
int H[10000],nrh;
//poz_ord indica sprea heap
//ord indica spre poz_ord dinspre heap
void adaugare_element(int val)
{
int poz,aux;
poz=++nrh;
ord[poz]=++nr;
poz_ord[nr]=poz;
H[poz]=val;
while(H[poz/2]>val && poz/2>0)
{
aux=H[poz];
H[poz]=H[poz/2];
H[poz/2]=aux;
poz_ord[ord[poz]]=poz/2;
poz_ord[ord[poz/2]]=poz;
aux=ord[poz];
ord[poz]=ord[poz/2];
ord[poz/2]=aux;
poz/=2;
}
//H[poz]=val;
//poz_ord[++nr]=poz;
//ord[poz]=nr;
}
void stergere_element(int poz)
{
int aux,f1,f2,son;
H[poz]=H[nrh];
poz_ord[ord[nrh]]=poz;
ord[poz]=ord[nrh--];
do{
f1=poz*2;
son=poz;
if(f1<=nrh && H[f1]<H[son])
{
son=f1;
f2=f1+1;
if(f2<=nrh && H[f2]<H[son])
son=f2;
}
else son=0;
if(son)
{
aux=H[son];
H[son]=H[poz];
H[poz]=aux;
aux=ord[son];
ord[son]=ord[poz];
ord[poz]=aux;
aux=poz_ord[ord[poz]];
poz_ord[ord[poz]]=poz_ord[ord[son]];
poz_ord[ord[son]]=aux;
}
}while(son);
}
int main()
{
int n,k,o,x;
fscanf(in,"%d",&n);
for(k=1;k<=n;++k)
{
fscanf(in,"%d",&o);
switch(o)
{
case(1):
fscanf(in,"%d",&x);
adaugare_element(x);
break;
case(2):
fscanf(in,"%d",&x);
stergere_element(poz_ord[x]);
break;
case(3):fprintf(out,"%d\n",H[1]);
break;
}
}
//cout<<n;
return 0;
}