Cod sursa(job #1815184)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 24 noiembrie 2016 22:03:39
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream ka("heapuri.in");
ofstream ki("heapuri.out");

const int N_MAX = 200000;

int n, x, c, heap_size;
int val[N_MAX + 1], heap[N_MAX + 1], poz[N_MAX + 1];

void urcare(int t)
{
    while(t / 2 && val[heap[t / 2]] > val[heap[t]])
    {
        swap(poz[heap[t / 2]], poz[heap[t]]);
        swap(heap[t / 2], heap[t]);
        t /= 2;
    }
}

void coborare(int t)
{
    if(2 * t <= heap_size)
    {
        if(val[heap[t]] > val[heap[2 * t]])
        {
            if(2 * t + 1 <= heap_size && val[heap[2 * t + 1]] < val[heap[2 * t]])
            {
                swap(poz[heap[t]], poz[heap[2 * t + 1]]);
                swap(heap[t], heap[2 * t + 1]);
                coborare(2 * t + 1);
            }
            else
            {
                swap(poz[heap[t]], poz[heap[2 * t]]);
                swap(heap[t], heap[2 * t]);
                coborare(2 * t);
            }

        }
        else if(2 * t + 1 <= heap_size && val[heap[2 * t + 1]] < val[heap[t]])
        {
            swap(poz[heap[t]], poz[heap[2 * t + 1]]);
            swap(heap[t], heap[2 * t + 1]);
            coborare(2 * t + 1);
        }
    }

}

int main()
{
    ka >> n;
    while(n--)
    {
        ka >> c;
        if(c == 1)
        {
            ka >> x;
            val[++poz[0]] = x;
            heap_size++;
            heap[heap_size] = poz[0];
            poz[poz[0]] = heap_size;
            urcare(heap_size);
        }
        else if(c == 2)
        {
            ka >> x;
            poz[heap[heap_size]] = poz[x];
            heap[poz[x]] = heap[heap_size];
            heap_size--;
            coborare(poz[x]);
        }
        else //if(c == 3)
            ki << val[heap[1]] << '\n';
        /*for(int i = 1; i <= heap_size; i++)
            cout << val[heap[i]] << " ";
        cout << '\n';*/
    }
}