Cod sursa(job #3123631)

Utilizator speedy_gonzalesDuca Ovidiu speedy_gonzales Data 24 aprilie 2023 22:13:45
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
#include <set>
#include <unordered_map>
#include <stack>
#include <iomanip>

using namespace std;

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

const int MAX = 200005;

int parent(int index) {
    return (index - 1) / 2;
}

int leftChild(int index) {
    return index * 2 + 1;
}

int rightChild(int index) {
    return index * 2 + 2;
}

void insert(vector<int> &heap, int value) {
    if ((int) heap.size() == 0) {
        heap.push_back(value);
        return;
    }
    heap.push_back(value);

    int child = (int) heap.size() - 1;
    int parentIndex = parent(child);

    while (child > 0 && heap[child] < heap[parentIndex]) {
        swap(heap[child], heap[parentIndex]);
        child = parentIndex;
        parentIndex = parent(child);
    }
}

void deleteValue(vector<int> &heap, int value) {
    int index = -1;
    for (int i = 0; i < (int) heap.size(); ++i) {
        if (heap[i] == value) {
            index = i;
            break;
        }
    }
    if (index == -1) {
        return;
    }

    swap(heap[index], heap[(int) heap.size() - 1]);
    heap.pop_back();

    while (index < (int) heap.size()) {
        int nextIndex = index;
        if (leftChild(index) < (int) heap.size() && heap[leftChild(index)] < heap[nextIndex]) {
            nextIndex = leftChild(index);
        }
        if (rightChild(index) < (int) heap.size() && heap[rightChild(index)] < heap[nextIndex]) {
            nextIndex = rightChild(index);
        }

        if (nextIndex == index) {
            break;
        }
        swap(heap[index], heap[nextIndex]);
        index = nextIndex;
    }
}

int main() {
    int n;
    fin >> n;

    vector<int> heap;

    int cnt = 0;
    vector<int> pos(MAX);

    for (int i = 0; i < n; ++i) {
        int x, y;
        fin >> x;
        if (x == 1) {
            fin >> y;
            pos[++cnt] = y;
            insert(heap, y);
        } else if (x == 3) {
            fout << heap[0] << "\n";
        } else if (x == 2) {
            fin >> y;
            deleteValue(heap, pos[y]);
        }
    }

    return 0;
}