Pagini recente » Cod sursa (job #1750365) | Cod sursa (job #616968) | Cod sursa (job #2746489) | Cod sursa (job #570060) | Cod sursa (job #2230045)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,i,x,y;
int ip,P[200005],id,D[200005],ih,H[200005];
void sift(int p)
{
int a=H[p],b=D[p],son;
while(p<=ih/2 && (H[p]>H[2*p]||H[p]>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[p]]=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]);
D[P[y]]=0;
P[y]=0;
}
if(x==3)
fout<<H[1]<<"\n";
}
}