Pagini recente » Cod sursa (job #945880) | Cod sursa (job #208019) | Cod sursa (job #1828381) | Cod sursa (job #1620918) | Cod sursa (job #370752)
Cod sursa(job #370752)
using namespace std;
#include <cstdio>
#include <cassert>
int heap[1<<18] , //heap[1] indicele din v al celui mei mic element
v[1<<18] , //elementele in ordinea data
poz[1<<18] , //poz[i] pozitia in heap a elementului introdus al i-lea
n , // numarule de elemente din heap la momentul curent
nrpoz; // numarul total de elemente introduse in heap, inclusiv cele sterse
void Add(int valoare){
v[++nrpoz]=valoare;
heap[++n] = nrpoz;
poz[nrpoz] = n;
int esteHeap = 0, i =n, aux;
while(!esteHeap && i>1)
if(v[heap[i/2]] < v[heap[i]])
esteHeap = 1;
else{
aux= heap[i], heap[i] = heap[i/2], heap[i/2] = aux;
poz[heap[i]] = i;
poz[heap[i/2]] = i/2;
i/=2;
}
}
void Delete(int pozitie){
int i = poz[pozitie], esteHeap=0, k, aux;
heap[i] = heap[n--];
poz[heap[i]] = i;
while(!esteHeap && 2*i<=n){
k=2*i;
if(k+1<=n && v[heap[k]]>v[heap[k+1]])
k++;
if(v[heap[i]] <v[heap[k]])
esteHeap = 1;
else{
aux=heap[i], heap[i] = heap[k], heap[k] =aux;
poz[heap[i]] = i;
poz[heap[k]] = k;
i=k;
}
}
}
int main(){
int nrop,op,x;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&nrop);
for( ; nrop ; --nrop){
scanf("%d", &op);
if(op == 3)
printf("%d\n" , v[heap[1]]);
else{
scanf("%d", &x);
if(op==1)
Add(x);
else
Delete(x);
}
}
return 0;
}