Cod sursa(job #1080618)

Utilizator PetreFlorinaFMI Petre Florina PetreFlorina Data 12 ianuarie 2014 18:11:09
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>

using namespace std;

int heap[200001], pos[200001], rev[200001], n, nr, nro;

void swap(int v[],int a,int b)
{
	int aux = v[a];
	v[a] = v[b];
	v[b] = aux;
}

void Actualizare(int NOD)
{
	while (NOD/2 > 0)
	{
		if (heap[NOD/2] > heap[NOD])
		{
			swap(heap, NOD/2, NOD);
			swap(pos, rev[NOD/2], rev[NOD]);
			swap(rev, NOD, NOD/2);
			NOD = NOD / 2;
		}
		else
			return;
	}
}

void Adaug(int NOD, int value, int aux)
{
	heap[NOD] = value;
	pos[aux] = NOD;
	rev[NOD] = aux;
	Actualizare(NOD);
}

void Cobor(int NOD)
{
	int sw = 0;

	while(NOD <= n)
	{
		if((2*NOD <= nr) && (heap[2*NOD] < heap[NOD]) && (heap[2*NOD] < heap[2*NOD + 1]) )
			{
			    NOD = 2*NOD;
			    sw = 1;
			}
		else
            if((2*NOD + 1 <= nr) && (heap[2*NOD + 1] < heap[NOD]))
                {
                    NOD = 2*NOD + 1;
                    sw = 1;
                }

		if ((NOD/2 > 0) && (sw == 1))
		{
			swap(heap, NOD/2, NOD);
			swap(pos, rev[NOD/2], rev[NOD]);
			swap(rev, NOD, NOD/2);
		sw = 0;
		}
		else
			return;
	}
}

void Remove(int NOD_pos)
{
	int NOD = pos[NOD_pos];
    heap[NOD] = -1;
    Actualizare(NOD);
	heap[1] = heap[ nr-- ];
	Cobor(1);
}


int main()
{
    int x, y;

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

	f >> n;

	for(int i=1; i<=n; i++)
	{
		f >> x;

		if (x == 3)
			g << heap[1] << "\n" ;
		else
            if( x == 1 )
              {
                f >> y;
                Adaug(++nr, y, ++nro);
              }
            else

                if( x == 2 )
                {
                    f >> y;
                    Remove(y);
                }
	}
	return 0;
}