Pagini recente » Cod sursa (job #44476) | Cod sursa (job #595385) | Cod sursa (job #15593) | Cod sursa (job #1955297) | Cod sursa (job #1577176)
#include <cstdio>
#define DMAX 200002
using namespace std;
FILE * fin=fopen("heapuri.in", "r");
FILE * fout=fopen("heapuri.out", "w");
struct heap
{
int inf;
int nr;
};
heap H[DMAX];
int poz[DMAX];
int n, nrop, minm, nrp;
void citire();
void inserare(int inf, int nrp);
void combinare(int i);
int extragere_min();
int main()
{
citire();
return 0;
}
void citire()
{
int i, cod, x, pz;
fscanf(fin, "%d", &nrop);
for (i=0; i<nrop; ++i)
{
fscanf(fin, "%d", &cod);
if (cod==1) // inserare
{
fscanf(fin, "%d", &x);
nrp++;
inserare(x, nrp);
}
else if (cod==2) // sterge
{
fscanf(fin, "%d", &x);
pz=poz[x];
H[pz]=H[n--];
combinare(pz);
}
else // minimul
fprintf(fout, "%d\n", extragere_min());
}
}
void inserare(int inf, int t)
{
int fiu, tata;
fiu=++n; tata=fiu/2;
while (tata && H[tata].inf>inf)
{
H[fiu]=H[tata];
poz[H[tata].nr]=fiu;
fiu=tata;
tata=fiu/2;
}
H[fiu].inf=inf;
H[fiu].nr=t;
poz[H[fiu].nr]=fiu;
}
void combinare(int i)
{
int inf = H[i].inf, tata, fiu;
int timp = H[i].nr;
tata=i; fiu=2*i;
while (fiu<=n)
{
if (fiu+1<=n && H[fiu].inf>H[fiu+1].inf) fiu++;
if (H[fiu].inf<inf)
{
H[tata]=H[fiu];
poz[H[fiu].nr]=tata;
tata=fiu;
fiu=2*tata;
}
else
break;
}
H[tata].inf=inf;
H[tata].nr=timp;
poz[timp]=tata;
}
int extragere_min()
{
return H[1].inf;
}