Cod sursa(job #1766276)

Utilizator wilson182Alexandrina Panfil wilson182 Data 27 septembrie 2016 19:51:51
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<bits/stdc++.h>
using namespace std;
#define N 200050
int n, h[N], k, ind[N], ord=0;
void addnode(int x, int index)
{
	h[index] = x;
    int i = index;
    ord++;
    ind[ord] = x;
    while (h[i] < h[i/2] && i >= 1){
        swap(h[i], h[i/2]);
        i = i/2;
    }
}
int search(int x, int index, int i)
{
    if (h[i] == ind[x]) return i;
	return search(x, index, i*2);
	return search(x, index, i*2+1);
}
void minheapify(int i)
{
	int l = 2*i;
    int r = 2*i +1;
    int smallest;
    if (l <= k && h[l] < h[i])    smallest = l;
    else smallest = i;
    if (r <= k && h[r] < h[smallest]) smallest = r;
    if (smallest != i)
    {
        swap(h[i], h[smallest]);
        minheapify(smallest);
    }
}
void extract(int x, int index)
{
	int i = search( x, index, 1);
	swap(h[i], h[index]);
	h[index] = 0;
	k--;
	minheapify(i);
}
int main()
{
	freopen("heap.in", "r", stdin);
	freopen("heap.out", "w", stdout);
	scanf("%d", &n);
	int i, x, y;
	k = 0;
	for (i = 0; i<n; i++) {
		scanf("%d", &x);
		if (x == 1){
			scanf("%d", &y);
			addnode(y, ++k);
		}
		if (x == 2) {
			scanf("%d", &y);
			extract(y, k);
		}
		if (x == 3) printf("%d\n", h[1]);
	}
	return 0;
}