Pagini recente » Cod sursa (job #2773498) | Cod sursa (job #1609438) | Cod sursa (job #2142268) | Cod sursa (job #2262130) | Cod sursa (job #2892181)
#include <fstream>
using namespace std;
int v[200010],poz[200010];
void baga(int v[],int poz[],int m){
int elem=v[m],pozitie=poz[m];
while(m>1 && elem<v[m/2]){
v[m]=v[m/2];
poz[m]=poz[m/2];
m/=2;
}
v[m]=elem;
poz[m]=pozitie;
}
void repara(int v[],int poz[],int m, int pozitie){
int fiu;
do{
fiu=0;
if(pozitie*2<=m){
fiu=pozitie*2;
if(pozitie*2+1<=m && v[pozitie*2+1] < v[pozitie*2])
fiu=pozitie*2+1;
if(v[fiu]>=v[pozitie])
fiu=0;
}
if (fiu){
swap(v[fiu],v[pozitie]);
swap(poz[fiu],poz[pozitie]);
pozitie=fiu;
}
} while (fiu);
}
void sterge(int v[],int poz[],int &m,int sterg){
for(int i=1;i<=m;++i) {
if (poz[i] == sterg) {
sterg=i;
break;
}
}
v[sterg]=v[m];
poz[sterg]=poz[m];
m--;
if(sterg>1 && v[sterg]<v[sterg/2])
baga(v,poz,sterg);
else
repara(v,poz,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++;
poz[m]=introdus;
baga(v,poz,m);
}
else{
f>>x;
sterge(v,poz,m,x);
}
}
return 0;
}