Pagini recente » Cod sursa (job #1621859) | Cod sursa (job #152117) | Cod sursa (job #159639) | Cod sursa (job #2108230) | Cod sursa (job #1577158)
#include <fstream>
#define dmax 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, poz[dmax], nrUlt; //poz=pozitia in heap a elem cu nr de ordine i
struct elem{ int inf, nr;}; //nr=nr de ordine a elem
elem h[dmax];
void inserare(int);
void combinare(int);
void stergereX(int);
int main(){
int operatie, x, m;
fin>>m;
for(int i=1; i<=m; ++i){
fin>>operatie;
if(operatie==1){
fin>>x;
inserare(x);
}
else if(operatie==2){
fin>>x;
stergereX(x);
}
else fout<<h[1].inf<<'\n';
}
fout.close();
return 0;
}
void inserare(int inf){
int fiu, tata;
fiu=++n; tata=fiu/2;
while(tata>0 && h[tata].inf>inf){
h[fiu]=h[tata];
poz[h[fiu].nr]=fiu;
fiu=tata;
tata=tata/2;
}
h[fiu].inf=inf;
h[fiu].nr=++nrUlt;
poz[nrUlt]=fiu;
}
void combinare(int i){
int inf=h[i].inf, tata=i, fiu=2*i;
while(fiu<=n){ //cat timp mai exista fii
if(fiu+1<=n && h[fiu].inf>h[fiu+1].inf) ++fiu; //fiu indica cel mai mic dintre fii
if(h[fiu].inf<inf){ //promovez pe cel mai mic dintre fii
h[tata]=h[fiu];
poz[h[tata].nr]=tata;
tata=fiu;
fiu=2*tata;
}
else break; //am gasit locul, ies
}
h[tata].inf=inf;
h[tata].nr=++nrUlt;
poz[nrUlt]=tata;
}
void stergereX(int nr){
h[poz[nr]]=h[n--];
combinare(poz[nr]);
}