Pagini recente » Cod sursa (job #833082) | Cod sursa (job #35424) | Cod sursa (job #1908421) | Cod sursa (job #338442) | Cod sursa (job #2892277)
#include <fstream>
using namespace std;
int v[200010],ordine[200010],pozitie[200010];
void baga(int m){
int elem=v[m];
while(m/2 && elem<v[m/2]){
v[m]=v[m/2];
pozitie[ordine[m]]= m / 2;
pozitie[ordine[m / 2]]=m;
swap(ordine[m], ordine[m / 2]);
m/=2;
}
v[m]=elem;
}
void repara(int m, int pozi){
int fiu;
do{
fiu=0;
if(pozi * 2 <= m){
fiu= pozi * 2;
if(pozi * 2 + 1 <= m && v[pozi * 2 + 1] < v[pozi * 2])
fiu= pozi * 2 + 1;
if(v[fiu]>=v[pozi])
fiu=0;
}
if (fiu){
swap(v[fiu],v[pozi]);
swap(pozitie[ordine[fiu]], pozitie[ordine[pozi]]);
swap(ordine[fiu], ordine[pozi]);
pozi=fiu;
}
} while (fiu);
}
void sterge(int &m,int sterg){
sterg=pozitie[sterg];
v[sterg]=v[m];
pozitie[ordine[m]]=pozitie[ordine[sterg]];
ordine[sterg]=ordine[m];
m--;
if(sterg>1 && v[sterg]<v[sterg/2])
baga(sterg);
else
repara(m,sterg);
}
int main(){
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,op,x,m=0,introdus=0;
f>>n;
for(int i=0;i<n;++i){
f>>op;
if(op==3){
g<<v[1]<<'\n';
}
else
if(op==1){
f>>x;
m++;
v[m]=x;
introdus++;
ordine[m]=introdus;
pozitie[ordine[introdus]]=m;
baga(m);
}
else{
f>>x;
sterge(m,x);
}
}
return 0;
}