Cod sursa(job #3155800)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 9 octombrie 2023 19:02:28
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <vector>
#include <iostream>
#define left(n) 2 * n
#define right(n) 2 * n + 1
#define N 200001
std::ifstream fin("heapuri.in");
std::ofstream fout("heapuri.out");
std::vector<int> list; int k = 0;
int elem[N], posarb[N];
void insert(int value, std::vector<int>& list){
    list[k++] = value;
    posarb[value] = k - 1;
    int x = k - 1;
    while(x != 0 && elem[list[x]] < elem[list[x / 2]]){
        std::swap(posarb[list[x]], posarb[list[x / 2]]);
        std::swap(list[x], list[x / 2]);
        x /= 2;
    }
}

void heapify(int node, std::vector<int>& list){
    int i = node, mn = elem[list[node]];
    if(left(node) < k && mn > elem[list[left(node)]]){
        mn = elem[ list[ left(node) ] ]; i = left(node);
    }
    if(right(node) < k && mn > elem[list[right(node)]]){
        mn = elem[list[right(node)]]; i = right(node);
    }
    if(i != node){
        std::swap(posarb[node], posarb[i]);
        std::swap(list[node], list[i]);
        heapify(i, list);
    }
}
void heapifyutil(int node, std::vector<int> &list){
    list[node] = list[k - 1];
    //elem[list[0]] = elem[list[k - 1]];
    k--;
    heapify(node, list);
}
void del(int node, std::vector<int>& list){
    elem[list[node]] = INT_MIN;
    list[node] = 0;
    while(node != 0 && elem[list[node]] < elem[list[node / 2]]){
        std::swap(posarb[list[node]], posarb[list[node / 2]]);
        std::swap(list[node], list[node / 2]);
        node /= 2;
    }
    heapifyutil(0, list);
}
int main(){
    int n;
    fin >> n;
    int op, x, cnt = 0;
    list = std::vector<int> (4 * n);
    for(int i = 1; i <= n; i++){
        fin >> op;
        if(op == 1){
            fin >> x;
            elem[++cnt] = x;
            insert(cnt, list);
        }
        else if(op == 2){
            fin >> x;
            del(posarb[x], list);
            
        }
        else{
            fout << elem[list[0]] << "\n";
        }
    }
    
    
}