Cod sursa(job #3252821)

Utilizator Ilinca_Radu_2022Radu Ilinca-Rucsandra Ilinca_Radu_2022 Data 31 octombrie 2024 12:02:12
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define MAX 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
/// poz[i] = pozitia in heap al elementului adaugat al i-lea in ordine cronologica
int i, cer, a, k, poz[MAX], s, n;
struct hp {
    int val, ord;
} heap[MAX];
void myswap(int a, int b) {
    swap(poz[heap[a].ord], poz[heap[b].ord]);
    swap(heap[a], heap[b]);
}
void up(int p) {
    while (heap[p].val<heap[p/2].val && p>1) {
        myswap(p, p/2);
        p/=2;
    }
}
void down(int p) {
    while (p*2<=s) {
        int t=2*p;
        if (p*2<s && heap[p*2].val>heap[p*2+1].val) t++;
        if (heap[t].val<heap[p].val) {
            myswap(p, t);
            p=t;
        }
        else return ;
    }
}
void adauga(int val, int ord) {
    s++;
    poz[ord]=s;
    heap[s]={val, ord};
    up(s);
}
void sterge(int ord) {
    if (poz[ord]==s) {
        s--;
        return ;
    }
    int x=poz[ord];
    myswap(x, s);
    s--;
    up(x);
    down(x);
}
int main()
{
    fin>>n;
    for (i=1; i<=n; i++) {
        fin>>cer;
        if (cer==1) {
            fin>>a;
            k++;
            adauga(a, k);
        }
        if (cer==2) {
            fin>>a;
            sterge(a);
        }
        if (cer==3) fout<<heap[1].val<<'\n';
    }
    return 0;
}