Pagini recente » Cod sursa (job #286988) | Cod sursa (job #288530) | Cod sursa (job #61291) | Cod sursa (job #1640960) | Cod sursa (job #2230049)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,x,y;
int ip,P[200005],D[200005],ih,H[200005];
void sift(int p)
{
int a=H[p],b=D[p],son;
while(p<=ih/2 && (a>H[2*p]||a>H[2*p+1]))
{
if(p<ih/2)
{
son=2*p+1;
if(H[son-1]<H[son]) son--;
}
else son=2*p;
H[p]=H[son];
D[p]=D[son];
P[D[son]]=p;
p=son;
}
H[p]=a;
D[p]=b;
P[b]=p;
}
void percolate(int p)
{
int a=H[p],b=D[p];
while(p>1 && a<H[p/2])
{
H[p]=H[p/2];
D[p]=D[p/2];
P[D[p]]=p;
p/=2;
}
H[p]=a;
D[p]=b;
P[b]=p;
}
void add(int x)
{
H[++ih]=x;
D[ih]=++ip;
P[ip]=ih;
percolate(ih);
}
void erase(int p)
{
H[p]=H[ih];
D[p]=D[ih];
P[D[ih]]=p;
ih--;
if(p<=ih)
{
if(H[p]>=H[p/2]) sift(p);
else percolate(p);
}
}
int main() {
fin>>n;
while(n--)
{
fin>>x;
if(x==1)
{
fin>>y;
add(y);
}
if(x==2)
{
fin>>y;
erase(P[y]);
}
if(x==3)
fout<<H[1]<<"\n";
}
}