Pagini recente » Cod sursa (job #824928) | Cod sursa (job #403386) | Cod sursa (job #393062) | Cod sursa (job #637137) | Cod sursa (job #1238126)
//v[i]=valoarea elementului intrat al i-lea in multime
//heap[i]=al catelea element intrat in multime este cel de pe pozitia i in heap
//poz[i]=pozitia in heap a elementului intrat al i-lea in multime
#include <stdio.h>
#define MAXN 200000
int n, heap[MAXN], v[MAXN], poz[MAXN];
inline int fiudr(int a){
return (a*2)+2;
}
inline int fiust(int a){
return (a*2)+1;
}
inline int tata(int a){
return (a-1)/2;
}
inline void swap(int p1, int p2){
int aux;
poz[heap[p1]]=p2;
poz[heap[p2]]=p1;
aux=heap[p1];
heap[p1]=heap[p2];
heap[p2]=aux;
}
inline void urcare(int p){
while((p!=0)&&(v[heap[p]]<v[heap[tata(p)]])){
swap(p, tata(p));
p=tata(p);
}
}
inline void coborare(int p){
while(((fiust(p)<n)&&(v[heap[fiust(p)]]<v[heap[p]]))||((fiudr(p)<n)&&(v[heap[fiudr(p)]]<v[heap[p]]))){
if((fiust(p)<n)&&(v[heap[fiust(p)]]<v[heap[p]])){
swap(fiust(p), p);
p=fiust(p);
}else{
swap(fiudr(p), p);
p=fiudr(p);
}
}
}
inline void elimina(int p){
n--;
heap[poz[p]]=heap[n];
poz[heap[n]]=poz[p];
if(poz[p]<n){
coborare(poz[p]);
}
}
inline void adauga(int p){
heap[n]=p;
poz[p]=n;
n++;
urcare(poz[p]);
}
int main(){
int t, i, q, x, k;
FILE *fin, *fout;
fin=fopen("heapuri.in" ,"r");
fout=fopen("heapuri.out", "w");
fscanf(fin, "%d", &t);
n=0;
k=0;
for(i=0; i<t; i++){
fscanf(fin, "%d", &q);
if(q==3){
fprintf(fout, "%d\n", v[heap[0]]);
}else{
fscanf(fin, "%d", &x);
if(q==2){
elimina(x-1);
}else{
v[k]=x;
adauga(k);
k++;
}
}
}
fclose(fin);
fclose(fout);
return 0;
}