Pagini recente » Cod sursa (job #457217) | Cod sursa (job #620109) | Cod sursa (job #3212258) | Cod sursa (job #2683706) | Cod sursa (job #1743861)
#include <iostream>
#include <fstream>
#define MAX_ELEMS 200001u
using namespace std;
struct HeapNod
{
unsigned int val;
size_t nod;
}Heap[MAX_ELEMS], aux;
unsigned int Log[MAX_ELEMS];
size_t node_nr = 0;
inline size_t parent(size_t y)
{
return (y/2);
}
inline size_t left(size_t y)
{
return (y*2);
}
inline size_t right(size_t y)
{
return (y*2 + 1);
}
void print()
{
for(size_t i = 1; i <= node_nr; i++)
cout << Heap[i].val << " ";
cout << endl;
}
void heapify(size_t node)
{
unsigned int aaux, crt_node = node;
while(Heap[crt_node].val < Heap[parent(crt_node)].val && crt_node > 1 && crt_node <= node_nr)
{
aaux = Log[Heap[crt_node].nod];
Log[Heap[crt_node].nod] = Log[Heap[parent(crt_node)].nod];
Log[Heap[parent(crt_node)].nod] = aaux;
aux = Heap[crt_node];
Heap[crt_node] = Heap[parent(crt_node)];
Heap[parent(crt_node)] = aux;
crt_node = parent(crt_node);
}
}
void inserare(unsigned int elem)
{
node_nr++;
Heap[node_nr].val = elem;
Heap[node_nr].nod = node_nr;
Log[node_nr] = node_nr;
heapify(node_nr);
}
void eliminare(unsigned int poz)
{
if(poz == node_nr)
{
node_nr--;
return;
}
Heap[poz] = Heap[node_nr];
node_nr--;
heapify(poz); //de modificat heapifyul
heapify(left(poz));
heapify(right(poz));
}
unsigned int minim()
{
return Heap[1].val;
}
int main()
{
unsigned int N, opt, elem;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
fin >> N;
for(size_t k = 0; k < N; k++)
{
fin >> opt;
if(opt == 1)
{
fin >> elem;
inserare(elem);
continue;
}
if(opt == 2)
{
fin >> elem;
eliminare(Log[elem]);
continue;
}
if(opt == 3)
{
fout << minim() << "\n";
}
}
fin.close();
fout.close();
return 0;
}