Cod sursa(job #1965004)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 13 aprilie 2017 21:22:39
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
#define MaxN 100005
#define INF 2140000000
using namespace std;

FILE *IN,*OUT;


int N,Type,X;
class Heap
{
	private:
		int Total;
		struct _Heap
		{
			int val,pos;
		};
		vector <_Heap> H;
		vector <int> Pos;
		void Make_Infinite(int node)
		{
			H[node].val=INF;
		}
		void Swap(int node1,int node2)
		{
			swap(Pos[H[node1].pos],Pos[H[node2].pos]);
			swap(H[node1],H[node2]);
		}
		void Up_Heap(int node)
		{
			while(node>=1&&H[node].val<H[node/2].val)
			{
				Swap(node,node/2);
				node/=2;
			}
		}
		void Down_Heap(int &node)
		{
			while(1)
			{
				int val=INF,son=0;
				if(2*node<H.size())
					son=2*node,val=H[2*node].val;
				if(2*node+1<H.size()&&val>H[2*node+1].val)
					son++,val=H[2*node+1].val;
				if(son&&val<H[node].val)
				{
					Swap(node,son);
					node=son;
				}
				else return;
			}
		}
	public:
		Heap(){Total=0;}
		int top()
		{
			if(H.size()==0)
				return -1;
			else return H[0].val;
		}
		void Add(int val)
		{
			_Heap aux;
			aux.pos=Total++,aux.val=val;
			Pos.push_back(H.size());
			H.push_back(aux);
			Up_Heap(H.size()-1);
		}
		void Delete(int node)
		{
			node=Pos[node];
			Make_Infinite(node);
			Down_Heap(node);
			Swap(node,H.size()-1);
			Up_Heap(node);
			H.pop_back();
		}
};
int main()
{
	IN=fopen("heapuri.in","r");
	OUT=fopen("heapuri.out","w");
	
	fscanf(IN,"%d",&N);
	Heap heap;
	for(int i=1;i<=N;i++)
	{
		fscanf(IN,"%d",&Type);
		if(Type==3)
			fprintf(OUT,"%d\n",heap.top());
		else if(Type==2)
		{
			fscanf(IN,"%d\n",&X);
			heap.Delete(X-1);
		}
		else 
		{
			fscanf(IN,"%d\n",&X);
			heap.Add(X);
		}
	}
	return 0;
}