Cod sursa(job #3169050)

Utilizator ioanabaduIoana Badu ioanabadu Data 13 noiembrie 2023 23:51:55
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <fstream>
#define N_MAX 200010

using namespace std;
ifstream in ("heapuri.in");
ofstream out ("heapuri.out");
int n, sizeHeap, contor, timeAdded[N_MAX];
pair <int, int> heap[N_MAX];

inline int indexLeftChild (int i) { return i*2; }
inline int indexRightChild (int i) { return i*2 + 1; }
inline int indexParent (int i) { return i/2; }

void upHeap (int x){
    while (x >= 1 && heap[x].first < heap[indexParent(x)].first){
        swap (heap[x], heap[indexParent(x)]);
        timeAdded[heap[x].second] = x;
        timeAdded[heap[indexParent(x)].second] = indexParent(x);
        x = indexParent(x);
    }
}

void downHeap (int x){
    int right = indexRightChild(x), left = indexLeftChild(x), smaller;
    smaller = x;
    if (left <= sizeHeap && heap[left].first < heap[smaller].first)
        smaller = left;
    if (right <= sizeHeap && heap[right].first < heap[smaller].first)
        smaller = right;
    if (smaller != x){
        swap (heap[x], heap[smaller]);
        timeAdded[heap[x].second] = x;
        timeAdded[heap[smaller].second] = smaller;
        downHeap (smaller);
    }
}

void add (int x){
    heap[++sizeHeap].first = x;
    contor++;
    timeAdded[contor] = contor; // indicele la care se alfa in heap
    heap[sizeHeap].second = sizeHeap;
    upHeap(sizeHeap);
}

void deleteElement (int x){
    swap (heap[sizeHeap], heap[timeAdded[x]]);
    sizeHeap--;
    downHeap (timeAdded[x]);
}

int main () {
    in >> n;
    int operation, value;
    for (int i=1; i<=n; i++){
        in >> operation;
        if (operation == 1){
            in >> value;
            add(value);
        }
        else if (operation == 2){
            in >> value;
            deleteElement(value);
        }
        else
            out << heap[1].first << '\n';
    }
    return 0;
}