Cod sursa(job #2651285)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 22 septembrie 2020 00:07:15
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>

using namespace std;

int arb[200010];
int positions[200010];
int actual_numbers[200010];

int n;


void sift(int k) {
    int minson = k, aux;
    while (k <n && minson) {
        minson = 0;
        if (k * 2 <= n && actual_numbers[arb[k*2]] < actual_numbers[arb[k]])
            if (k * 2 + 1 <= n)
                if (actual_numbers[arb[k*2]] > actual_numbers[arb[k*2+1]])
                    minson = k * 2 + 1;
                else
                    minson = k * 2;
            else
                minson = k * 2;
        else
            if (k * 2 + 1 <= n && actual_numbers[arb[k*2 + 1]] < actual_numbers[arb[k]])
                minson = k * 2 + 1;

        if (minson == 0)
            break;

        aux = arb[minson];
        arb[minson] = arb[k];
        arb[k] = aux;

        positions[arb[k]] = k;
        positions[arb[minson]] = minson;

        k = minson;
    }
}


void percolate(int k) {
	int aux;

	while(k>1) {
        if (actual_numbers[arb[k/2]] > actual_numbers[arb[k]])
        {
            aux = arb[k/2];
            arb[k/2] = arb[k];
            arb[k] = aux;

            positions[arb[k]] = k;
            positions[arb[k/2]] = k/2;

            k = k/2;
        } else break;
	}
}

int main() {
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);

	int m, a, b, total_number = 0;
	scanf("%d", &m);

	for(int i=0; i<m; ++i) {
		scanf("%d", &a);

		switch(a) {
			case 1:
				scanf("%d", &b);
				++total_number;
				++n;

				actual_numbers[total_number] = b;
				arb[n] = total_number;
				positions[total_number] = n;

				percolate(n);
				break;
			case 2:
				scanf("%d", &b);
				actual_numbers[b] = -1;
				percolate(positions[b]);

				positions[arb[1]] = -1;
				arb[1] = arb[n];
				positions[arb[1]] = 1;
				--n;
				sift(1);

				break;
			case 3:
				printf("%d\n", actual_numbers[arb[1]]);
		}

	}

	return 0;
}