Cod sursa(job #2416417)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 27 aprilie 2019 15:33:16
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200005;

int heap[MAXN], pos[MAXN];
int len, cnt;

void heapsus(int p){
    if(p < 1 && heap[p] < heap[p / 2]){
        swap(heap[p], heap[p / 2]);
        swap(pos[p], pos[p / 2]);
        heapsus(p / 2);
    }
}

void heapjos(int p){
    int f1 = 2 * p, f2 = 2 * p + 1, np = p;
    if(f1 <= len && heap[p] > heap[f1]) np = f1;
    if(f2 <= len && heap[p] > heap[f2]) np = f2;
    if(np != p){
        swap(heap[p], heap[np]);
        swap(pos[p], pos[np]);
        heapjos(np);
    }
}

void add(int x){
    heap[++len] = x;
    pos[len] = ++cnt;
    heapsus(len);
}

void del(int x){
    int p = 0;
    for(int i = 1; i <= len; ++i)
        if(pos[i] == x)
            p = i;
    swap(heap[p], heap[len]);
    len--;
    heapjos(p);
    heapsus(p);
}

int main()
{
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
    int n;
    fin >> n;
    for(int i = 1; i <= n; ++i){
        int op, x;
        fin >> op;
        if(op < 3) fin >> x;
        if(op == 1) add(x);
        else if(op == 2) del(x);
        else fout << heap[1] << "\n";
    }
    return 0;
}