Cod sursa(job #2230045)

Utilizator shantih1Alex S Hill shantih1 Data 8 august 2018 21:25:13
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#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";
	}
}