Pagini recente » Rating alupei ciprian (alupeiciprian) | Cod sursa (job #1709117) | Cod sursa (job #2223520) | Cod sursa (job #2168259) | Cod sursa (job #1763867)
#include <fstream>
#define nmax 200005
using namespace std;
unsigned int h[nmax],rh[nmax],n;
int d[nmax];
void inser(unsigned int x)
{
while ( (x!=1) && ( d[h[x]] < d[h[x/2]]) )
{
swap( h[x], h[x/2]);
rh[h[x]]=x;
rh[h[x/2]]=x/2;
x/=2;
}
}
void sterg(unsigned int x)
{
unsigned int y=0;
while (x!=y)
{
y=x;
if ( (y*2<=n) && (d[h[x]]>d[h[2*y]]) ) x=2*y;
//daca y are fiu in stanga si e mai mic ca el
if ( (y*2+1<=n) && (d[h[x]]>d[h[2*y+1]]) ) x=2*y+1;
//daca y are fiu in dreapta si e mai mic ca el
swap(h[x],h[y]);
rh[h[x]]=x;
rh[h[y]]=y;
}
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
unsigned int m,op,x,nou=0;
for (f>>m;m;m--)
{
f>>op;
if (op==3) g<<d[h[1]]<<'\n';
else
{
f>>x;
if (op==1)
{
n++,nou++;
d[nou]=x;
h[n]=nou;
rh[nou]=n;
inser(n);
}
else
{
d[x]=-1;
inser(rh[x]);
//aducem in varf elementul sters
rh[h[1]]=0;
//stergem elementul din rh
h[1]=h[n];
rh[h[1]]=1;
//aducem ultimul element in varf
n--;
if (n>1) sterg(1);
//daca mai avem elemente in heap, il echilibram
}
}
}
f.close();
g.close();
return 0;
}