Pagini recente » Cod sursa (job #2793399) | Cod sursa (job #664688) | Cod sursa (job #1145152) | Cod sursa (job #2277824) | Cod sursa (job #1389867)
#include <cstdio>
const int MAXN = 200010;
int heap[MAXN];
int nheap = 0;
int indice_heap[MAXN]; //indexare de la 1, pentru interogari
int indice_indice_heap[MAXN]; //pentru fiecare element din heap care
//este indicele sau corespunzator in vectorul indice_heap
int nr_elem_inserate = 0;
//interschimba 2 elem, pastrand referintele corecte si in vectorii indice_heap
//si indice_indice_heap
void interschimba_elemente(int poz1, int poz2)
{
int v1 = indice_indice_heap[poz1];
int v2 = indice_indice_heap[poz2];
int aux = heap[poz1];
heap[poz1] = heap[poz2];
heap[poz2] = aux;
aux = indice_heap[v1];
indice_heap[v1] = indice_heap[v2];
indice_heap[v2] = aux;
aux = indice_indice_heap[poz1];
indice_indice_heap[poz1] = indice_indice_heap[poz2];
indice_indice_heap[poz2] = aux;
}
void lift(int poz)
{
while (poz != 1 && heap[poz/2] > heap[poz])
{
interschimba_elemente(poz,poz/2);
poz /= 2;
}
}
void sink(int poz)
{
while (2*poz <= nheap)
{
int pozf1 = 2*poz;
int pozf2 = 2*poz+1;
int pozfmin;
if (pozf2 <= nheap && heap[pozf2] < heap[pozf1])
pozfmin = pozf2;
else
pozfmin = pozf1;
if (heap[pozfmin] < heap[poz])
{
interschimba_elemente(poz,pozfmin);
poz = pozfmin;
}
else
break;
}
}
void inserare_heap(int x)
{
++nheap; //indexare de la 1
heap[nheap] = x;
++nr_elem_inserate;
indice_heap[nr_elem_inserate] = nheap;
indice_indice_heap[nheap] = nr_elem_inserate;
lift(nheap);
}
void sterge_elem(int poz) //sterge elem de la pozitia poz din heap
{
interschimba_elemente(nheap,poz); //se putea si fara interschimbare, pt referinte
--nheap;
if (poz != 1 && heap[poz/2] > heap[poz])
lift(poz);
else sink(poz); //incearca
}
void citire_si_prelucrare()
{
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++)
{
int op,x;
scanf("%d",&op);
if (op == 1 || op == 2)
scanf("%d",&x);
if (op == 1)
inserare_heap(x);
else if (op == 2)
sterge_elem(indice_heap[x]);
else
printf("%d\n",heap[1]); //presupunem ca exista elemente
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
citire_si_prelucrare();
return 0;
}