Pagini recente » Cod sursa (job #1109498) | Cod sursa (job #810489) | Cod sursa (job #2167830) | Cod sursa (job #2407287) | Cod sursa (job #2586276)
#include <bits/stdc++.h>
#define MAX 200000 + 5
using namespace std;
struct HeapElem
{
int id;
int val;
}Heap[MAX];
int n, m, cnt, elemHeap[MAX];
inline int father(int k)
{
return k >> 1;
}
inline int left_son(int k)
{
return k << 1;
}
inline int right_son(int k)
{
return (k << 1) + 1;
}
inline int top_heap()
{
return Heap[1].val;
}
void percolate(int k)
{
HeapElem key = Heap[k];
while(k > 1 && Heap[father(k)].val > key.val)
{
int fatherId = Heap[father(k)].id;
elemHeap[fatherId] = k;
Heap[k] = Heap[father(k)];
k = father(k);
}
Heap[k] = key;
elemHeap[key.id] = k;
}
void sift(int k)
{
int son;
do
{
son = 0;
if(left_son(k) <= n)son = left_son(k);
if(right_son(k) <= n && Heap[son].val > Heap[right_son(k)].val)son = right_son(k);
if(son && Heap[k].val > Heap[son].val)
{
swap(elemHeap[Heap[k].id], elemHeap[Heap[son].id]);
swap(Heap[k], Heap[son]);
k = son;
}else son = 0;
}while(son);
}
void add_element(int k)
{
n++;
cnt++;
elemHeap[cnt] = n;
Heap[n].id = cnt;
Heap[n].val = k;
percolate(n);
}
void cut_element(int id)
{
int pozHeap = elemHeap[id];
Heap[pozHeap] = Heap[n];
elemHeap[Heap[n].id] = pozHeap;
elemHeap[id] = -1;
n--;
if(pozHeap > 1 && Heap[pozHeap].val > Heap[father(pozHeap)].val)
percolate(pozHeap);
else
{
sift(pozHeap);
}
}
int main()
{
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
// ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
fin >> m;
for(int i = 1; i <= m; i++)
{
int op;
fin >> op;
if(op == 1)
{
int elem;
fin >> elem;
add_element(elem);
// afisareHeap();
}
else if(op == 2)
{
int id;
fin >> id;
cut_element(id);
//afisareHeap();
}
else fout << top_heap() << '\n';
}
fin.close();
fout.close();
return 0;
}