Cod sursa(job #2293246)

Utilizator richard26Francu Richard richard26 Data 30 noiembrie 2018 17:58:38
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define N_max	200010

using namespace std;

long long heap[N_max], ap[N_max], poz[N_max];

void minheap(int n)
{
	while (heap[n] < heap[n / 2] && (n / 2) >= 1)
	{
		swap(heap[n], heap[n / 2]);
		ap[poz[n]] = n / 2;
		ap[poz[n/2]] = n;
		swap(poz[n], poz[n / 2]);
		n /= 2;

	}
}


void erase(int n, int i)
{	
	swap(heap[i], heap[n]);
	ap[poz[i]] = n;
	ap[poz[n]] = i;
	swap(poz[i], poz[n]);

	while((heap[i] > heap[i * 2] && (i * 2) < n) || (heap[i] > heap[i * 2 + 1] && (i * 2 + 1) < n))
	{
		if (heap[i * 2] < heap[i * 2 + 1] && (i * 2) < n)
		{
			swap(heap[i], heap[i * 2]);
			ap[poz[i]] = i * 2;
			ap[poz[i * 2]] = i;
			swap(poz[i], poz[i * 2]);
			i *= 2;
		}
		else if (heap[i * 2] >= heap[i * 2 + 1] && (i * 2 + 1) < n)
		{
			swap(heap[i], heap[i * 2 + 1]);
			ap[poz[i]] = i * 2 + 1;
			ap[poz[i * 2 + 1]] = i;
			swap(poz[i], poz[i * 2 + 1]);
			i = i * 2 + 1;
		}
		 else if((i * 2) < n)
		 {
		 	swap(heap[i], heap[i * 2 ]);
		 	ap[poz[i]] = i * 2;
		 	ap[poz[i * 2]] = i;
		 	swap(poz[i], poz[i * 2]);
		 	i *= 2;
		 }
		 else return ;
	}
}
int main()
{
	ifstream f("heapuri.in");
	ofstream g("heapuri.out");

	int N, c;
	f>>N;

	int n = 0;
	int j = 0;
	long long x;
	for (int i = 1; i <= N; i++)
	{
		f>>c;
		if(c == 3) g<<heap[1]<<"\n";
			else{
				
				f>>x;
				if(c == 1){
					n++;
					j++;
					ap[j] = n;
					poz[n] = j;
					heap[n] = x;
					minheap(n);
				}
				if( c == 2){

					
					erase(n, ap[x]);
					n--;
				}
			}
	}

	return 0;
}