Pagini recente » Cod sursa (job #247506) | Cod sursa (job #1568614) | Istoria paginii utilizator/alvaro.regueira-vilar | Diferente pentru home intre reviziile 425 si 426 | Cod sursa (job #552945)
Cod sursa(job #552945)
#include<fstream>
#define nmax 200020
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int c,z,k,el;
long n,poz[nmax];
struct cod{
long a,b;
};
cod hp[nmax];
void upheap(int nod){
cod aux;
while(hp[nod].a<hp[nod/2].a){
aux=hp[nod/2],hp[nod/2]=hp[nod],hp[nod]=aux;
poz[hp[nod].b]=nod,poz[hp[nod/2].b]=nod/2,nod=nod/2;
}
}
void downheap(int nod){
cod aux;
if(2*nod<=k)
if(hp[2*nod].a>hp[2*nod+1].a&&hp[2*nod+1].a){
aux=hp[2*nod+1],hp[2*nod+1]=hp[nod],hp[nod]=aux;
poz[hp[nod].b]=nod,poz[hp[2*nod+1].b]=2*nod+1,downheap(2*nod+1),++el;
}
else{
aux=hp[2*nod],hp[2*nod]=hp[nod],hp[nod]=aux;
poz[hp[nod].b]=nod,poz[hp[2*nod].b]=2*nod,downheap(2*nod),++el;
}
}
int main(){
long p;
f>>n;
for(int i=1;i<=n;i++){
f>>c;
if(c==1)
f>>z,poz[++k]=k,hp[k].a=z,hp[k].b=k+el,upheap(k);
if(c==2)
f>>z,p=poz[z],hp[poz[z]]=hp[k],poz[z]=hp[k].b,hp[k].a=0,poz[k]=0,hp[k].b=0,k--,downheap(p);
if(c==3)
g<<hp[1].a<<'\n';
}
return 0;
}