Pagini recente » Cod sursa (job #3157838) | Cod sursa (job #1889399) | Cod sursa (job #836324) | Cod sursa (job #2067398) | Cod sursa (job #1981037)
#include <stdint.h>
#include <fstream>
#include <stdlib.h>
#define nmax 200001
using namespace std;
fstream f1("heapuri.in", ios::in);
fstream f2("heapuri.out", ios::out);
int32_t n, pz[nmax], nrelh;
struct heap
{
int32_t val;
int32_t nrord;
}h[nmax];
///n= nr operatii
///nrelh= numar elemente heap
///h= heapul
///poz[i]= pozitia pe care se afla in heap al i-lea element introdus
void insereaza(int32_t val, int32_t ord)
{
nrelh++;
int32_t tata=nrelh/2, fiu=nrelh;
while((tata!=0)&&(h[tata]. val>val))
{
h[fiu]=h[tata];
pz[h[tata].nrord]=fiu;
fiu=tata;
tata/=2;
}
h[fiu].val=val;
h[fiu].nrord=ord;
pz[ord]=fiu;
}
void sterge(int32_t poz)
{
//stergi elementul cu pozitia poz din heap
int32_t val, ord;
h[poz]=h[nrelh];
ord=h[nrelh].nrord;
val=h[poz].val;
pz[ord]=poz;
nrelh--;
///cobori cat este nevoie nodul poz
int32_t tata=poz, fiu=poz*2, mos;
if((nrelh>=poz*2+1)&&(h[poz*2+1].val < h[poz*2].val)) fiu++;
while((fiu<=nrelh)&&(val> h[fiu].val))
{
h[tata]=h[fiu];
pz[h[fiu].nrord]=tata;
tata=fiu;
fiu*=2;
if((nrelh>=fiu+1)&&(h[fiu+1].val < h[fiu].val)) fiu++;
}
h[tata].val=val;
h[tata].nrord=ord;
pz[ord]=tata;
///urci daca e nevoie nodul din pozitia tata
mos=tata/2;
while((mos!=0)&&(val< h[mos].val))
{
h[tata]=h[mos];
pz[h[mos].nrord]= tata;
tata=mos;
mos/=2;
}
h[tata].val=val;
h[tata].nrord=ord;
pz[ord]=tata;
}
int main()
{
int32_t i, x, nrord=0;
int16_t op;
f1>>n;
for(i=1; i<=n; i++)
{
f1>>op;
if(op==1)
{
f1>>x;
nrord++;
insereaza(x, nrord);
///nrord= numarul de ordine al elementului x
}
else if(op==2)
{
f1>>x;
sterge(pz[x]);
}
else
{
f2<<h[1].val<<"\n";///afisezi minimul curent
}
}
return 0;
}