Cod sursa(job #3305831)

Utilizator horatiu.avramAvram Popa Cristian Horatiu horatiu.avram Data 5 august 2025 17:13:27
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int nv,nh,n,v[MAXN],h[MAXN],poz[MAXN];
void schimba(int p1,int p2) {
    swap(h[p1],h[p2]);
    poz[h[p1]]=p1;
    poz[h[p2]]=p2;
}
void urca(int p) {
    while(p>0&&v[h[p]]<v[h[(p-1)/2]]) {
        schimba(p,(p-1)/2);
        p=(p-1)/2;
    }
}
void insereaza(int p) {
    h[nh++]=p;
    poz[p]=nh-1;
    urca(nh-1);
}
void coboara(int p) {
    int mn=p;
    if(2*p+1<nh&& v[h[2*p+1]]<v[h[mn]]) {
        mn=2*p+1;
    }
    if(2*p+2<nh&&v[h[2*p+2]]<v[h[mn]]) {
        mn=2*p+2;
    }
    if(mn!=p) {
        schimba(p,mn);
        coboara(mn);
    }
}
void sterge(int p) {
    if(p==nh-1) {
        nh--;
        return;
    }
    schimba(p,nh-1);
    nh--;
    urca(p);
    coboara(p);
}
int main() {
    fin>>n;
    for(int i=0; i<n; i++) {
        int task;
        fin>>task;
        if(task==1) {
            fin>>v[nv++];
            insereaza(nv-1);
        } else if(task==2) {
            int pv;
            fin>>pv;
            pv--;
            sterge(poz[pv]);
        } else {
            fout<<v[h[0]]<<'\n';
        }
    }
    return 0;
}