Pagini recente » Cod sursa (job #2612226) | Cod sursa (job #1377901) | Cod sursa (job #991826) | Cod sursa (job #1513179) | Cod sursa (job #3272613)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
struct poz_init{
int poz;
int nr;
};
poz_init v[200003];//mini heap ul
bool viu[200003];//pastrez statusul elem de pe poz init
bool exista(int poz,int ult_poz){//+ daca tatal e mai mic ca fiul(eu intru cu fiul)
return poz<=ult_poz && poz>=1 && v[poz/2].nr>v[poz].nr;
}
int main()
{
int m;
fin>>m;
int ult_poz=0;//ca sa am acces la ult elem inserat
for(int i=1;i<=m;i++){
int cer;
fin>>cer;
if(cer==1){
///citire
ult_poz++;
int x;
fin>>x;
viu[ult_poz]=true;
v[ult_poz].nr=x;
v[ult_poz].poz=ult_poz;//o sa se schimbe pozitia pe care e initial in heap
///rearenjez corect elem
int p=ult_poz;
while(p>1 && v[p/2].nr>v[p].nr){//tatal> fiul
swap(v[p],v[p/2]);
p/=2;
}
}
else if(cer==2){
///setez ca mort numarul de pe poz initiala x
int x;
fin>>x;
viu[x]=false;
}
else if(cer==3){
///verif daca elem min e mort
while(viu[v[1].poz]==false && ult_poz>=1){
///sterg mortul
swap(v[1],v[ult_poz]);
ult_poz--;
///corectez heap ul
int n=1;
while( exista(2*n+1, ult_poz) || exista(2*n, ult_poz) ){//daca min 1 fiu exista
if( exista(2*n, ult_poz) && exista(2*n+1, ult_poz)){//daca exista ambii
if(v[2*n].nr<=v[2*n+1].nr){//f1<=f2
swap(v[n],v[2*n]);
n=2*n;
}
else{//f2<f1
swap(v[n],v[2*n+1]);
n=2*n+1;
}
}
else if(exista(2*n, ult_poz)){//daca doar f1 exista
swap(v[n],v[2*n]);
n=2*n;
}
else if(exista(2*n+1, ult_poz)){//daca doar f2 exista
swap(v[n],v[2*n+1]);
n=2*n+1;
}
}
}
///afisez elem min
if(ult_poz>=1)
fout<<v[1].nr<<'\n';
}
}
return 0;
}