Cod sursa(job #1183330)

Utilizator flore77Simion Florentin flore77 Data 8 mai 2014 20:32:56
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

int v[200010];
int c;

void pushUp (int heap[], int poz, int p, int i) {
    if (poz == 0)
        return;
    int indice = (poz - 1) / 2;
    if (heap[indice] > heap[poz]) {
        int aux;
        aux = heap[indice];
        heap[indice] = heap[poz];
        heap[poz] = aux;
        v[p] = indice;
        v[i] = poz;
        v[poz] = indice;
        v[indice] = poz;
        pushUp(heap, indice, p , i);
    }
}

void pushDown (int heap[], int poz, int dimVect, int p) {
    int indice;
    int i;
    if (2 * poz + 2 > dimVect && 2 * poz + 1 > dimVect)
            return;
        else if (2 * poz + 2 > dimVect && 2 * poz + 1 <= dimVect)
            indice = 2 * poz + 1;
        else if (2 * poz + 2 <= dimVect && 2 * poz + 1 > dimVect)
            indice = 2 * poz + 2;
        else {
            if (heap[2 * poz + 2] > heap[2 * poz + 1])
                indice = 2 * poz + 1;
            else
                indice = 2 * poz + 2;
        }
    if (c == 0) {
        i = indice;
        c++;
    }
    if (heap[poz] > heap[indice]) {
        int aux;
        aux = heap[indice];
        heap[indice] = heap[poz];
        heap[poz] = aux;
        v[p] = indice;
        v[i] = poz;
        v[poz] = indice;
        v[indice] = poz;
        pushDown(heap,indice,dimVect,p);
    }
}

int main() {
    ifstream in;
    in.open("heapuri.in");
    ofstream out;
    out.open("heapuri.out");
    int n, i, Op, x, *heap, dim = 0;
    in >> n;
    heap = new int[n];
    for (i = 0; i < n; i++) {
        in >> Op;
        if (Op == 1) {
            in >> x;
            heap[dim] = x;
            v[dim] = dim;
            pushUp(heap,dim,dim,(dim - 1) / 2);
            dim++;
        }
        else if (Op == 2) {
            in >> x;
            dim--;
            heap[v[x-1]] = heap[dim];
            pushDown(heap,v[x-1],dim,v[x-1]);
            c--;
        }
        else {
            out << heap[0] << "\n";
        }
    }
    in.close();
    out.close();
    return 0;
}