Pagini recente » Cod sursa (job #1091780) | Cod sursa (job #844797) | Cod sursa (job #3183281) | Cod sursa (job #2634658) | Cod sursa (job #1539639)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int H[200010],pozitie[200010],elem[200010],n,d;
int tata(int nod)
{
return nod/2;
}
int fiu_st(int nod)
{
return nod*2;
}
int fiu_dr(int nod)
{
return nod*2+1;
}
void swap(int a,int b)
{
int x=elem[a],y=elem[b],aux;
aux=H[b];
H[b]=H[a];
H[a]=aux;
elem[b]=x;
pozitie[x]=b;
elem[a]=y;
pozitie[y]=a;
}
void sift(int k)
{
int son;
do{
son=0;
if(fiu_st(k)<=n)
{
son=fiu_st(k);
if(fiu_dr(k)<=n&&H[fiu_dr(k)]<H[fiu_st(k)])
son = fiu_dr(k);
if (H[son]>=H[k])
son=0;
}
if(son)
{
swap(k,son);
k=son;
}
} while(son);
}
void percolate(int k)
{
int nod=H[k];
while((k>1)&&(nod<=H[tata(k)]))
{
swap(k,tata(k));
k=tata(k);
}
H[k]=nod;
}
void stergere(int k)
{
swap(k,n);
--n;
if((k>1)&&(H[k]<H[tata(k)]))
percolate(k);
else
sift(k);
}
void inserare(int nod)
{
H[++n]=nod;
pozitie[++d]=n;
elem[n]=d;
percolate(n);
}
int main()
{
int t,nr,x;
f>>nr;
for(int i=1;i<=nr;i++)
{
f>>t;
if(t==1)
{
f>>x;
inserare(x);
}
if(t==2)
{
f>>x;
stergere(pozitie[x]);
}
if(t==3)
{
g<<H[1]<<"\n";
}
}
return 0;
}