Pagini recente » Cod sursa (job #2323690) | Cod sursa (job #1956558) | Cod sursa (job #2522631) | Cod sursa (job #149384) | Cod sursa (job #2730293)
#include <bits/stdc++.h>
#define Nmax 200005
using namespace std;
priority_queue<int, vector<int>, greater<int>>Q;
struct heap_node
{
int val, poz_in_vec;
}v[250005], aux;
int w[200005];
/*
void heap_push(int poz, heap_node Node)
{
if(v[poz].poz_in_vec == 0 || Node.val < v[poz].val)
{
if(v[poz].poz_in_vec != 0)
{
if(v[2 * poz].poz_in_vec == 0)heap_push(2 * poz, v[poz]);
else if (v[2 * poz + 1].poz_in_vec == 0)heap_push(2 * poz + 1, v[poz]);
else if(v[2 * poz].val > v[2 * poz + 1].val)heap_push(2 * poz, v[poz]);
else heap_push(2 * poz + 1, v[poz]);
}
v[poz] = Node;
w[v[poz].poz_in_vec] = poz; // w[poz] = the node in heap where we have the poz-th elem
}
else
{
if(v[2 * poz].poz_in_vec == 0)heap_push(2 * poz, Node);
else if (v[2 * poz + 1].poz_in_vec == 0)heap_push(2 * poz + 1, Node);
else if(v[2 * poz].val > v[2 * poz + 1].val)heap_push(2 * poz, Node);
else heap_push(2 * poz + 1, Node);
}
}
*/
void lift(int poz)
{
if(v[poz / 2].val > v[poz].val && poz / 2 > 0)
{
swap(v[poz], v[poz / 2]);
if(v[poz / 2].poz_in_vec != 0)swap(w[v[poz].poz_in_vec], w[v[poz / 2].poz_in_vec]);
lift(poz / 2);
}
}
void heap_push(heap_node Node, int ct)
{
int first_free = Q.top();
Q.pop();
v[first_free] = Node;
w[ct] = first_free;
lift(first_free);
}
void remove_heap_node(int poz)
{
if(v[2 * poz].poz_in_vec == 0 && v[2 * poz + 1].poz_in_vec == 0)
{
v[poz].poz_in_vec = 0;
Q.push(poz);
}
else if(v[2 * poz].poz_in_vec == 0)
{
v[poz] = v[2 * poz + 1];
w[v[poz].poz_in_vec] = poz;
remove_heap_node(2 * poz + 1);
}
else if(v[2 * poz + 1].poz_in_vec == 0)
{
v[poz] = v[2 * poz];
w[v[poz].poz_in_vec] = poz;
remove_heap_node(2 * poz);
}
else if(v[2 * poz].val < v[2 * poz + 1].val)
{
v[poz] = v[2 * poz];
w[v[poz].poz_in_vec] = poz;
remove_heap_node(2 * poz);
}
else
{
v[poz] = v[2 * poz + 1];
w[v[poz].poz_in_vec] = poz;
remove_heap_node(2 * poz + 1);
}
}
int n, i, op, ct, x, pozz;
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
for(i = 1; i <= Nmax; i ++)
Q.push(i);
f >> n;
for(i = 1; i <= n; i ++)
{
f >> op;
if(op == 1)
{
f >> x;
ct = ct + 1;
aux.val = x;
aux.poz_in_vec = ct;
heap_push(aux, ct);
}
if(op == 2)
{
f >> pozz;
remove_heap_node(w[pozz]);
}
if(op == 3)
{
g << v[1].val << "\n";
}
}
return 0;
}