Cod sursa(job #3343060)

Utilizator andreiPaladeAndrei Razvan Palade andreiPalade Data 26 februarie 2026 13:57:25
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int heap[200005], timeline[200005], poz[200005], u=0, hc=0;
int n;

void tests(){
    int i;
    for(i=1;i<=hc;i++)
        cout<<heap[i]<<" ";
    cout<<endl;
    for(i=1;i<=hc;i++)
        cout<<timeline[i]<<" ";
    cout<<endl;
    cout<<endl;
}

void upHeap(int x, int y){
    if(x*y==0) return;
    if(heap[x]<heap[y]){
        swap(heap[x], heap[y]);
        swap(timeline[x], timeline[y]);
        poz[timeline[x]]=x;
        poz[timeline[y]]=y;
        upHeap(y, y/2);
    }
}

void downHeap(int x){
    int son=x*2;
    if(son+1<=hc and heap[son+1]<heap[son])
        son++;
    if(son<=hc){
        if(heap[son]<heap[x]){
            swap(heap[son], heap[x]);
            swap(timeline[son], timeline[x]);
            poz[timeline[son]]=son;
            poz[timeline[x]]=x;
            downHeap(son);
        }
    }
}

void add(int value){
    hc++;
    u++;
    timeline[hc]=u;
    poz[u]=hc;
    heap[hc]=value;
    upHeap(hc, hc/2);
}

void del(int value){
    int nod, i;
    nod=poz[value];
    swap(heap[nod], heap[hc]);
    swap(timeline[nod], timeline[hc]);
    poz[timeline[nod]]=nod;
    poz[timeline[hc]]=hc;
    hc--;
    downHeap(nod);
    upHeap(nod, nod/2);
}

int main()
{
    int i, task, value;
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>task;
        if(task==1){
            fin>>value;
            add(value);
        }
        else if(task==2){
            fin>>value;
            del(value);
        }
        else
            fout<<heap[1]<<"\n";
    }
    return 0;
}