Cod sursa(job #2941069)

Utilizator stefan24Sandor Stefan stefan24 Data 17 noiembrie 2022 08:49:24
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;
#define nmax 200000
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int heap[nmax+5],poz[nmax+5],n;

void urcare(int k){
    while(k>1){
        if(heap[k]<=heap[k/2])return;
        else swap(heap[k],heap[k/2]),poz[heap[k]]=k,poz[heap[k/2]]=k/2,k/=2;
    }
}

void coborare(int k){
    while(k*2<=n){
        int p=k*2;
        if(p+1<=n and heap[p]>heap[p+1])p++;
        if(heap[k]>=heap[p])return;
        else swap(heap[k],heap[p]),poz[heap[p]]=p,poz[heap[k]]=k,k=p;
    }
}

int main()
{
    int q;
    f>>q;
    for(int i=1;i<=q;++i){
        int cer;f>>cer;
        if(cer==1){
            int x;f>>x;
            heap[++n]=x;
            poz[x]=n;
            urcare(n);
        }
        if(cer==2){
            int x;f>>x;
            urcare(poz[x]);
            heap[1]=heap[n--];
            poz[heap[1]]=1;
            coborare(1);
        }
        if(cer==3){
            g<<heap[1]<<"\n";
        }
    }
}