Cod sursa(job #552946)

Utilizator alexandru93moraru alexandru sebastian alexandru93 Data 13 martie 2011 11:35:41
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#define nmax 200020
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
long c,z,k,el;
long long int 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;
}