Cod sursa(job #2572831)

Utilizator luisavluisa v luisav Data 5 martie 2020 14:28:31
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct heap{
int val,ind;
}h[300001];
int k,poz[300001];

void upheap(int nod){
int tata=nod/2;
if(tata>0){
    if(h[nod].val<h[tata].val){
       poz[h[nod].ind]=tata;
       poz[h[tata].ind]=nod;
       swap(h[nod],h[tata]);
       upheap(tata);
    }
}
}


void downheap(int nod)
{
    int fius=2*nod;
    int fiud=fius+1;
    int fiu_min=fius;
    if (fiud<=k){
        if(h[fiud].val<h[fius].val)fiu_min++;
    }
    if(fiu_min<=k&&h[nod].val>h[fiu_min].val){
        poz[h[fiu_min].ind]=nod;
        poz[h[nod].ind]=fiu_min;
        swap(h[fiu_min],h[nod]);
        downheap(fiu_min);
    }

}

void sterge(int x){

int pozh=poz[x];

poz[h[k].ind]=pozh;
poz[h[pozh].ind]=k;
swap(h[pozh],h[k]);
k--;
downheap(pozh);
}
void insereaza(int valoare){

k++;
h[k].val=valoare;
h[k].ind=k;
poz[k]=k;
upheap(k);
}
int main()
{
 int nr;
 in>>nr;
 for(int i=1;i<=nr;i++){
    int q;
    in>>q;
    if(q==1){
        int x;
        in>>x;
        insereaza(x);
    }
    if(q==2){
        int px;
        in>>px;
        sterge(px);
    }
    if(q==3)
        out<<h[1].val<<'\n';
 }
    return 0;
}