Cod sursa(job #713739)

Utilizator mening12001Andrei Geogescu mening12001 Data 14 martie 2012 21:44:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
vector<long long > v;
long long n,a,z,k,p[200000],pp[200000],x,y;


void del(int k)
{p[pp[v.size()-1]]=k;
	pp[k]=pp[v.size()-1];
	
	swap(v[k],v[v.size()-1]);
	v.pop_back();
	
	
	if(v[k]<v[k>>1])
		while(k>1)
			if(v[k]<v[k>>1])
	{swap(v[k],v[k>>1]);
			p[pp[k>>1]]=k;
			p[pp[k]]=k>>1;
			swap(pp[k],pp[k>>1]);
			k=k>>1;}
	else
		break;
	else
		if(v[k]>v[k<<1]||v[k]>=v[k<<1+1])
	while(k<<1<=v.size()-1)
		if(v[k]>v[k<<1]&&v[k<<1]<v[k<<1+1])
			{swap(v[k],v[k<<1]);
		p[pp[k]]=k<<1;
		p[pp[k<<1]]=k;
		swap(pp[k],pp[k<<1]);
		
		
		k=k<<1;}
		else
			if(v[k]>v[k<<1+1]&&v[k<<1+1]<v[k<<1])
	        {swap(v[k],v[k<<1+1]);
			
		p[pp[k]]=k<<1+1;
		p[pp[k<<1+1]]=k;
		swap(pp[k],pp[k<<1+1]);
			
			
			
			k=k<<1+1;}
			else
				break;}

void add(int a)
{for(int i=1;i<=n;i++)
{
k++;

v.push_back(a);
z=v.size()-1;
p[k]=z;
pp[z]=k;
while(z>1)
if(v[z]<v[z>>1])
{swap(v[z],v[z>>1]);
p[pp[z]]=z>>1;
p[pp[z>>1]]=z;
swap(pp[z],pp[z>>1]);
z=z>>1;}
else
break;}
	
}


int main()
{
ofstream h("heapuri.out");
ifstream f("heapuri.in");
v.push_back(-1200);
f>>n;
for(int i=1;i<=n;i++)
f>>x;
if(x==1)
	{f>>y;
add(y);}
else
	if(x==2)
		{f>>y;
	del(p[y]);}
		else
			h<<v[1];

return 0;}