Cod sursa(job #2894976)

Utilizator KataIsache Catalina Kata Data 28 aprilie 2022 17:40:22
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");

int v[200005], H[200005],N;
unordered_map <int,int> poz;

void inserare(int x){
    H[++N]=x;
    poz[x]=N;
    while(x<H[poz[x]/2] && poz[x]>1){
        H[poz[x]]=H[poz[x]/2];
        poz[H[poz[x]]]=poz[x];
        poz[x]/=2;
    }
    H[poz[x]]=x;
}

void stergere(int x){
    H[poz[x]]=H[N];
    poz[H[poz[x]]]=poz[x];
    N--;
    int pozitie=poz[x];
    if(H[pozitie]<H[pozitie/2]){
        //urcare
        while(H[pozitie]<H[pozitie/2] && pozitie>1){
            H[pozitie]=H[pozitie/2];
            poz[H[pozitie]]=pozitie;
            pozitie/=2;
        }
        H[pozitie]=H[N+1];
        poz[H[pozitie]]=pozitie;
    }
    else{
        while(H[pozitie]>min(H[pozitie*2], H[pozitie*2+1]) && (pozitie*2+1)<=N){
            if(H[pozitie*2]<=H[pozitie*2+1]){
                int aux=H[pozitie];
                H[pozitie]=H[pozitie*2];
                H[pozitie*2]=aux;
                poz[H[pozitie]]=pozitie;
                poz[H[pozitie*2]]=pozitie*2;
                pozitie*=2;
            }
            else{
                int aux=H[pozitie];

                H[pozitie]=H[pozitie*2+1];
                 H[pozitie*2+1]=aux;
                poz[H[pozitie]]=pozitie;
                poz[H[pozitie*2]]=pozitie*2;
                pozitie=pozitie*2+1;
            }
        }
        if(pozitie*2==N && H[pozitie]>H[pozitie*2])
        {
            H[pozitie]=H[pozitie*2];
            poz[H[pozitie]]=pozitie;
                pozitie*=2;
        }
        H[pozitie]=H[N+1];
        poz[H[pozitie]]=pozitie;
    }

}

int main() {
    int n,i,op,x;
    fin>>n;
    while(n--){
        fin>>op;
        if(op==1){
            i++;
            fin>>x;
            v[i]=x;
            inserare(x);
        }
        else if(op==2){
            fin>>x;
            stergere(v[x]);
        }
        else
            fout<<H[1]<<'\n';
    }
    return 0;
}