Cod sursa(job #713798)

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



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/2])
		while(k>1)
			if(v[k]<v[k/2])
	{swap(v[k],v[k/2]);
			p[pp[k/2]]=k;
			p[pp[k]]=k/2;
			swap(pp[k],pp[k/2]);
			k=k/2;}
	else
		break;
	else
		if(v[k]>v[k*2]||v[k]>v[k*2+1])
	while(k*2<=v.size()-1)
		if(k*2+1>v.size()-1)
		if(v[k]>v[k*2])
		{swap(v[k],v[k*2]);
		p[pp[k]]=k*2;
		p[pp[k*2]]=k;
		swap(pp[k],pp[k*2]);
				k=k*2;}
		else
			if(v[k]>v[k*2]&&v[k*2]<=v[k*2+1])
		{swap(v[k],v[k*2]);
		p[pp[k]]=k*2;
		p[pp[k*2]]=k;
		swap(pp[k],pp[k*2]);
		
		
		k=k*2;}
			else
			
			
			
			
			
			
			
			if(v[k]>v[k*2+1]&&v[k*2+1]<v[k*2])
	        {swap(v[k],v[k*2+1]);
			
		p[pp[k]]=k*2+1;
		p[pp[k*2+1]]=k;
		swap(pp[k],pp[k*2+1]);
			
			
			
			k=k*2+1;}
			else
				break;
}

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



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

			h<<v[1]<<"\n";}





return 0;}