Cod sursa(job #3174956)

Utilizator Ionut10Floristean Ioan Ionut10 Data 25 noiembrie 2023 11:04:21
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

using namespace std;

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

const int NMAX = 200002;

int n;
int H[NMAX]; int N = 0;
int pos[NMAX];
int nr;

void inserare(int x, int idx) {
    int fiu = N + 1;
    int tata = fiu / 2;
    while (tata != 0 && H[tata] > x) {
        pos[tata] = fiu;
        H[fiu] = H[tata];
        fiu = tata;
        tata = fiu / 2;
    }
    pos[idx] = fiu;
    H[fiu] = x;
    N++;
}

void combinare(int poz, int i) {
    int tata, fiu, x;
    x = H[poz];
    tata = poz;
    fiu = 2 * tata;
    while (fiu <= N) {
        if (fiu + 1 <= N && H[fiu + 1] < H[fiu])
            fiu++;
        if (H[fiu] < x) {
            pos[fiu] = tata;
            H[tata] = H[fiu];
            tata = fiu;
            fiu = 2 * tata;
        }
        else {
            break;
        }
    }
    pos[i] = tata;
    H[tata] = x;
}

int main()
{
     fin >> n;
     for (int i = 1; i <= n; i++) {
            int op, x;
        fin >> op;
        if (op == 1) {
            fin >> x; nr++;
            pos[nr] = nr;
            inserare(x, nr);
        }
        else if (op == 2) {
            fin >> x;
            H[pos[x]] = H[N--];
            combinare(pos[x],i);
        }
        else
            fout << H[1] << '\n';
    }
    return 0;
}