Pagini recente » Istoria paginii utilizator/voyager | Clasament dupa rating | Cod sursa (job #113506) | Monitorul de evaluare | Cod sursa (job #369569)
Cod sursa(job #369569)
using namespace std;
#include <cstdio>
#include <cassert>
int heap[1<<18] , ordine[1<<18] , n;
void Add(int valoare){
heap[++n] = valoare ; ordine[n] = 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;
// aux = ordine[i]; ordine[i] = ordine[i/2]; ordine[i/2] = aux;
i = i/2;
}
}
void Delete(int indice){
int aux , poz = 0;
// aux = heap[poz]; heap[poz] = heap[n]; heap[n] = aux;
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);
}
}
/*
for(int i =1 ; i <=n ;i++)
printf("%d ", heap[i]);
printf("\n");
for(int i =1 ; i <=n ;i++)
printf("%d ", ordine[i]);
printf("\n");
*/
return 0;
}