Cod sursa(job #1810426)

Utilizator d0rina2011Craciun Dorina d0rina2011 Data 20 noiembrie 2016 00:17:07
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int ins[200001], nr_elem_heap, poz[200001], nr_inserate;
struct heap{
    int val, poz;// pozitia pe care a fost inserat initial
}v[200001];
void inter(heap &a, heap &b){
    heap aux = a;
    a = b;
    b = aux;
}
void inter2(int &a, int &b){
    int aux;
    aux = a;
    a = b;
    b = aux;
}
void operatia_1(int x){

    nr_elem_heap++;
    v[nr_elem_heap].val = x;
    nr_inserate++;
    v[nr_elem_heap].poz = nr_inserate;
    poz[nr_inserate]= nr_elem_heap;
    int nr_elem_heap2 = nr_elem_heap;

    while(v[nr_elem_heap2 / 2].val > v[nr_elem_heap2].val && nr_elem_heap2 >= 2){
        inter(v[nr_elem_heap2 / 2], v[nr_elem_heap2]);
        inter2(poz[v[nr_elem_heap2 / 2].poz], poz[v[nr_elem_heap2].poz]);
        nr_elem_heap2 /= 2;
    }

}

void operatia_2(int x){

    v[poz[x]] = v[nr_elem_heap];
    poz[v[nr_elem_heap].poz] = poz[x];
    --nr_elem_heap;

    int nr_elem_heap2 = nr_elem_heap;

    while(v[nr_elem_heap2 / 2].val > v[nr_elem_heap2].val && nr_elem_heap2 >= 1){
        inter(v[nr_elem_heap2 / 2], v[nr_elem_heap2]);
        inter2(poz[v[nr_elem_heap2 / 2].poz], poz[v[nr_elem_heap2].poz]);
        nr_elem_heap2 /= 2;
    }

    while(((v[nr_elem_heap2].val > v[2 * nr_elem_heap2 + 1].val || v[nr_elem_heap2].val > v[2 * nr_elem_heap2].val)) && 2 * nr_elem_heap2 + 1 < nr_elem_heap){
        if(v[2 * nr_elem_heap2 + 1].val > v[2 * nr_elem_heap2].val){
            inter(v[nr_elem_heap2 * 2], v[nr_elem_heap2]);
            inter2(poz[v[nr_elem_heap2 * 2].poz], poz[v[nr_elem_heap2].poz]);
            nr_elem_heap2 *= 2;
        } else {
            inter(v[nr_elem_heap2 * 2 + 1], v[nr_elem_heap2]);
            inter2(poz[nr_elem_heap2 * 2 + 1], poz[nr_elem_heap2]);
            nr_elem_heap2 = nr_elem_heap2 * 2 + 1;
        }
    }
}

void operatia_3(){
    fout<<v[1].val<<'\n';
}

int main()
{
    int nr_operatii, i, operatie, x;
    fin>>nr_operatii;
    for(i = 1; i <= nr_operatii; ++i){
        fin>>operatie;
        if(operatie < 3){
            fin>>x;
        }
        switch(operatie){
            case 1: operatia_1(x); break;
            case 2: operatia_2(x); break;
            case 3: operatia_3(); break;
        }
    }
    return 0;
}