Pagini recente » Cod sursa (job #1446981) | Cod sursa (job #3258410) | Cod sursa (job #1608983) | Cod sursa (job #1791607) | Cod sursa (job #2541842)
#include <bits/stdc++.h>
#define nmax 400005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct dubla{
int valoare, indice_adaugare;
}heap[nmax];
int heap_size;
int pozitie_in_heap[nmax];
vector <int> numere_adaugate;
void create_heap()
{
int i;
heap[0].valoare = -1;
for(i = 1; i < nmax; i++)
heap[i].valoare = 2000000000;
}
void adaugare_element(dubla element)
{
heap_size++;
int pos1 = heap_size, pos2 = (heap_size >> 1);
heap[heap_size] = element;
pozitie_in_heap[element.indice_adaugare] = pos1;
while(heap[pos1].valoare < heap[pos2].valoare)
{
pozitie_in_heap[heap[pos1].indice_adaugare] = pos2;
pozitie_in_heap[heap[pos2].indice_adaugare] = pos1;
swap(heap[pos1], heap[pos2]);
pos1 = pos2;
pos2 = (pos2 >> 1);
}
}
void coborare(int pos1)
{
int pos2 = (pos1 << 1);
if(heap[pos2].valoare > heap[pos2 + 1].valoare)
++pos2;
if(heap[pos1].valoare > heap[pos2].valoare)
{
pozitie_in_heap[heap[pos1].indice_adaugare] = pos2;
pozitie_in_heap[heap[pos2].indice_adaugare] = pos1;
swap(heap[pos1], heap[pos2]);
coborare(pos2);
}
}
void stergere_element(int pozitie)
{
heap[pozitie] = heap[heap_size];
heap[heap_size].valoare = 2000000000;
heap_size--;
pozitie_in_heap[heap[pozitie].indice_adaugare] = pozitie;
coborare(pozitie);
}
int main()
{
int i, operatie, x, j = 1, k, l;
dubla sclav;
heap_size = 0;
create_heap();
fin >> k;
for(i = 0; i < k; i++)
{
fin >> operatie;
if(operatie == 3)
fout << heap[1].valoare << '\n';
else
fin >> x;
if(operatie == 1)
{
sclav.indice_adaugare = j;
j++;
sclav.valoare = x;
adaugare_element(sclav);
}
else if (operatie == 2)
stergere_element(pozitie_in_heap[x]);
}
return 0;
}