Pagini recente » Cod sursa (job #728042) | Cod sursa (job #2141995) | Cod sursa (job #1968440) | Cod sursa (job #2937860) | Cod sursa (job #625166)
Cod sursa(job #625166)
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int N=200001;
struct element{
int val;//valoarea elementului din heap
int ord;//numar de ordine de adaugare in heap al elementului
}h[N];//vectorul heap;
int hsize, poz_h[N],nrelem;//pozitia in heap pe care se afla elementul i bagat in multime si nr de elemente adaugate in multime
inline void schimba2(int x,int y){
poz_h[x]^=poz_h[y];
poz_h[y]^=poz_h[x];
poz_h[x]^=poz_h[y];
}
inline void schimba(int a,int b){
element aux;
schimba2(h[a].ord,h[b].ord);
aux=h[b];
h[b]=h[a];
h[a]=aux;
}
inline void adauga(int x){
int aux;
nrelem++;
hsize++;
h[hsize].val=x;
h[hsize].ord=nrelem;
poz_h[nrelem]=hsize;
aux=hsize;
while(h[aux/2].val>h[aux].val && aux/2){
schimba(aux,aux/2);
aux/=2;
}
}
inline void coboara(int x){
int aux;
if(2*x>hsize)
return;
if(2*x==hsize)
aux=2*x;
else{
if(h[2*x].val>h[2*x+1].val)
aux=2*x+1;
else
aux=2*x;
}
schimba(aux,x);
coboara(aux);
}
inline void elimina(int x){
int aux;
aux=poz_h[x];
schimba(poz_h[x],hsize);
poz_h[x]=0;
hsize--;
coboara(aux);
}
int main(){
int n,i,op,aux;
in>>n;
for(i=1;i<=n;i++){
in>>op;
if(op==3){
out<<h[1].val<<"\n";
continue;
}
if(op==1){
in>>aux;
adauga(aux);
}
if(op==2){
in>>aux;
elimina(aux);
}
}
return 0;
}