Cod sursa(job #3130909)

Utilizator CiprianHutanuHutanu Ciprian CiprianHutanu Data 18 mai 2023 19:41:30
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>

std::ifstream in;
std::ofstream out;

class heap{
//    std::vector<int> v;
int v[200005], n;
public:
    heap();
    void descent(int);
    void rise(int);
    void insert(int);
    void pop(int);
    int top();
    int find(int);
};

void heap::descent(int pos) {
    int aux;
    if (2 * pos + 1 >= n)
        return;
    if ((2 * pos + 2 == n) or v[2 * pos + 1] < v[2 * pos + 2])
        if (v[2 * pos + 1] < v[pos])
        {
            aux = v[pos];
            v[pos] = v[2 * pos + 1];
            v[2 * pos + 1] = aux;
            heap::descent(2 * pos + 1);
            return;
        }
        else
            return;
    else
    if (v[2 * pos + 2] < v[pos])
    {
        aux = v[pos];
        v[pos] = v[2 * pos + 2];
        v[2 * pos + 2] = aux;
        heap::descent(2 * pos + 2);
        return;
    }
    else
        return;
}

void heap::rise(int pos) {
    while(pos){
        if(v[(pos - 1) / 2] > v[pos]){
            int aux = v[(pos - 1) / 2];
            v[(pos - 1) / 2] = v[pos];
            v[pos] = aux;
            pos = (pos - 1) / 2;
        }
        else
            break;
    }
}

void heap::insert(int val) {
    v[n++] = val;
    heap::rise(n-1);
}

void heap::pop(int pos) {
    if(pos == -1)
        return;
    v[pos] = v[n-1];
    n--;
    heap::descent(pos);
    heap::rise(pos);
}

int heap::top() {
    return v[0];
}

int heap::find(int val) {
    for(int i = 0; i < n; i++)
        if(v[i] == val)
            return i;
    return -1;
}

heap::heap() {
    n = 0;
}


int main() {
    int n, v[200005], i, op, x, m=0;
    heap h;

    in.open("heapuri.in");
    out.open("heapuri.out");

    in>>n;
    for(i = 0; i < n; i++){
        in>>op;
        if(op == 1){
            in >> x;
            v[m++] = x;
            h.insert(x);
        }
        else if(op==2){
            in >> x;
            h.pop(h.find(v[x-1]));
        }
        else if(op == 3){
            out<<h.top()<<'\n';
        }
    }

    in.close();
    out.close();

    return 0;
}