Pagini recente » Cod sursa (job #138881) | Cod sursa (job #1031211) | Cod sursa (job #3005463) | Cod sursa (job #157932) | Cod sursa (job #415172)
Cod sursa(job #415172)
#include <fstream>
#define max_heap 500002
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int h[max_heap],elem[max_heap],poz[max_heap],n,n1,x,op;
namespace ucc
{
void swap (int x,int y)
{
poz[h[x]]=y;
poz[h[y]]=x;
std::swap (h[x],h[y]);
}
}
inline int tata (int);
inline int fiu_st (int);
inline int fiu_dr (int);
inline int min ();
void up_heap (int k)
{
while ((k>1) && (h[k]<h[tata(k)]))
{
ucc::swap (k,tata(k));
k=tata(k);
}
}
void down_heap (int k)
{
int fiu;
do
{
fiu = 0;
if (fiu_st(k) <= n)
{
fiu = fiu_st(k);
if (fiu_dr(k) <= n)
if( h[fiu_dr(k)] < h[fiu_st(k)])
fiu= fiu_dr(k);
if (h[fiu] >= h[k]) // a ajuns pe pozitia corecta
fiu = 0;
}
if (fiu)
{
ucc::swap(k,fiu);
k=fiu;
}
} while (fiu);
}
void pop_heap (int k)
{
h[k]=h[n];
n--;
if ((k>1) && (h[k]<h[tata(k)]))
up_heap(k);
else
down_heap (k);
}
int main ()
{
f>>n1;
for (int i=1; i<=n1; i++)
{
f>>op;
switch (op)
{
case 1:
f>>x;
elem[++elem[0]]=x; // elem - vector cu numere in ordinea inserarii lor
n++;
poz[x]=n;
h[n]=x;
up_heap (n);
break;
case 2:
f>>x;
pop_heap (poz[elem[x]]);
break;
case 3:
g<<min()<<'\n';
}
}
f.close (); g.close (); return 0;
}
inline int tata (int nod)
{
return nod/2;
}
inline int fiu_st (int nod)
{
return nod*2;
}
inline int fiu_dr (int nod)
{
return nod*2+1;
}
inline int min ()
{
return h[1];
}