Cod sursa(job #3171656)

Utilizator ililogIlinca ililog Data 19 noiembrie 2023 12:11:07
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>

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

int n, t, x;
struct nod{
    int val, pos;
} h[200005];

int l, p[200005];

void promoveaza(int i) {
    while (i != 1 && h[i].val < h[i/2].val) {
        swap(p[h[i].pos], p[h[i/2].pos]);
        swap(h[i], h[i/2]);
        i = i/2;
    }
}

int insereaza(int x, int pos) {
    
    h[++l].val = x;
    h[l].pos = pos;
    p[pos] = l;
    
    promoveaza(l);
}

void sterge(int pos) {
    
    swap(p[h[pos].pos], p[h[l].pos]);
    swap(h[pos], h[l]);
    l--;
    
    if (pos > 1 && h[pos/2].val > h[pos].val) {
        promoveaza(pos);
    } else {
        while ((pos*2 <= l && h[pos*2].val < h[pos].val) ||
                (pos*2+1 <= l && h[pos*2+1].val < h[pos].val)){
            
            if (pos*2+1 > l || h[pos*2].val < h[pos*2+1].val) { ///mergem in stanga
                swap(p[h[pos].pos], p[h[pos*2].pos]);
                swap(h[pos], h[pos*2]);
                pos = pos*2;
            } else {  ///mergem in dreapta
                swap(p[h[pos].pos], p[h[pos*2+1].pos]);
                swap(h[pos], h[pos*2+1]);
                pos = pos*2+1;
            }
            
        }
    }
}

int main() {
    
    fin >> n;
    for (int i = 1; i<=n; i++) {
        fin >> t;
        if (t == 1) {
            fin >> x;
            insereaza(x, i);
            
           /* for (int j = 1; j<=l; j++) {
                cout << h[j].val << " ";
            }
            cout << endl;*/
        } else if (t == 2) {
            fin >> x;
            sterge(p[x]);
            
            /*for (int j = 1; j<=l; j++) {
                cout << h[j].val << " ";
            }
            cout << endl;*/
        } else if (t == 3) {
            fout << h[1].val << "\n";
        }
    }
    
    return 0;
}