Pagini recente » Cod sursa (job #1650006) | Cod sursa (job #2023144) | Cod sursa (job #54345) | Istoria paginii utilizator/whitestorm | Cod sursa (job #370743)
Cod sursa(job #370743)
using namespace std;
#include <cstdio>
#include <cassert>
int heap[1<<18] , ordine[1<<18] , n,pozmax;
void Add(int valoare){
heap[++n] = valoare ; ordine[++pozmax] = valoare;
int esteHeap = 0, i = n , aux;
while(i/2 && !esteHeap)
if(heap[i]>= heap[i/2])
esteHeap = 1;
else{
aux = heap[i]; heap[i] = heap[i/2] ; heap[i/2] = aux;
i = i/2;
}
}
void Delete(int indice){
int aux , poz = 0;
for(int i = 0; i<=n && !poz ; ++i)
if(heap[i] == ordine[indice])
poz = i;
assert(poz>0);
heap[poz] = heap[n--];
int esteHeap = 0, i=poz, k;
while(2*i<=n && !esteHeap)
{
k=2*i;
if(k+1<=n && heap[k+1]<heap[k])
k++;
if(heap[i]<heap[k])
esteHeap=1;
else{
aux=heap[i]; heap[i] = heap[k]; heap[k] = aux;
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" , heap[1]);
else{
scanf("%d", &x);
if(op==1)
Add(x);
else
Delete(x);
}
}
return 0;
}