Cod sursa(job #2129079)

Utilizator tudor199G Tudor tudor199 Data 12 februarie 2018 14:47:01
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>

#define nMax 200003

#define SWAP(a, b) (v[0] = v[a], v[a] = v[b], v[b] = v[0])
#define SWAP_ORD(a, b) (ord[0] = a, ord[ord_1[a]] = b, ord[ord_1[b]] = ord[0],      ord_1[0] = ord_1[a], ord_1[a] = ord_1[b], ord_1[b] = ord_1[0])

using namespace std;

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

int v[nMax], n_heap = 0;
int ord[nMax], ord_1[nMax], n_ord = 0;

void add(int x){
    int nod = ++ n_heap;
    v[nod] = x;
    while(nod != 1 && v[nod] < v[nod / 2]){
        SWAP(nod, nod / 2);
        ord[ord_1[nod / 2]] = nod;
        ord_1[nod] = ord_1[nod / 2];
        nod = nod / 2;
    }
    ord[++ n_ord] = nod;
    ord_1[nod] = n_ord;
    return;
}
void remove(int nod){
    int minim;
    ord_1[nod] = ord_1[n_heap];
    v[nod] = v[n_heap];
    -- n_heap;
    while(nod != 1 && v[nod] < v[nod / 2]){
        SWAP_ORD(nod, nod / 2);
        SWAP(nod, nod / 2);
        nod = nod / 2;
    }
    while(true){
        if(2 * nod > n_heap){
            break;
        }
        if(2 * nod == n_heap){
            minim = 2 * nod;
        }
        else{
            minim = (v[2 * nod] < v[2 * nod + 1] ? (2 * nod) : (2 * nod + 1));
        }
        if(v[nod] < v[minim]){
            break;
        }
        SWAP_ORD(nod, minim);
        SWAP(nod, minim);
        nod = minim;
    }
    return;
}

int main(){
    int n, o , x;
	fin>>n;
	while(n --){
        fin>>o;
        switch(o){
        case 1:
            fin>>x;
            add(x);
            break;
        case 2:
            fin>>x;
            remove(ord[x]);
            break;
        default:
            fout<<v[1]<<"\n";
            break;
        }
	}
	return 0;
}