Cod sursa(job #766785)

Utilizator iris88Nagy Aliz iris88 Data 12 iulie 2012 10:46:30
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
vector<int> Q;
vector<int> val;
vector<int> heapIndex;
void push(int k,int index)
{	
	Q.push_back(k);
	int p = (index-1)>>1;
	while (index>0 && val[Q[p]]>val[Q[index]])
	{
	  int swapp = Q[index];
	  Q[index] = Q[p];
	  Q[p]=swapp;
	  heapIndex[Q[index]] = index;	  
	  index = p;	 
	  p = (index-1)>>1;
	}
	heapIndex[Q[index]] = index;
}
int pop(int index)
{
	int p = Q[index];
	Q[index]=Q[Q.size()-1];
	heapIndex[Q[index]]=index;
	Q.pop_back();
	int minindex;
	bool swap;
	while(true){
		minindex = index;
		int left = (index<<1)+1;
		int right = left+1;
		if (left<Q.size() && val[Q[left]]<val[Q[index]])
			minindex = left;
		if (right<Q.size() &&val[Q[right]]<val[Q[minindex]])
			minindex = right;
		if (minindex!=index)
		{
			int swapp = Q[minindex];
			Q[minindex] = Q[index];
			Q[index] = swapp;
			heapIndex[Q[index]] = index;	
			heapIndex[Q[minindex]] = minindex;
			swap = true;
		}
		else return p;
		index = minindex;
	};
	return 0;
}

int main()
{
	ifstream f("heapuri.in");
	ofstream g("heapuri.out");

	int n;
	f>>n;
	int order=0;
	for (int i=0;i<n;i++)
	{
		int op,x;
		f>>op;
		switch (op)
		{
			case 1:
			{
				f>>x;
				val.push_back(x);
				heapIndex.push_back(Q.size());
				push(val.size()-1,Q.size());
				break;
			}				
			case 2:
				f>>x;
				pop(heapIndex[x-1]);
				break;
			case 3:
				g<<val[Q.front()]<<endl;
				break;
			default:
				break;
		}
	}
	g.close();
	f.close();
}