Pagini recente » Cod sursa (job #2906805) | Cod sursa (job #647476) | Cod sursa (job #1409497) | Borderou de evaluare (job #2116764) | Cod sursa (job #2586150)
#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 > 2 && Heap[father(k)].val > key.val)
{
Heap[k] = Heap[father(k)];
elemHeap[Heap[k].id] = elemHeap[Heap[father(k)].id];
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(Heap[k], Heap[son]);
swap(elemHeap[Heap[k].id], elemHeap[Heap[son].id]);
k = son;
}
}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)
{
Heap[elemHeap[id]] = Heap[n];
elemHeap[Heap[n].id] = elemHeap[id];
n--;
if(elemHeap[id] > 1 && Heap[elemHeap[id]].val > Heap[father(elemHeap[id])].val)percolate(elemHeap[id]);
else
{
// cout << "am intrat in sift" << '\n';
sift(elemHeap[id]);
}
}
void afisareHeap()
{
for(int i = 1; i <= n; i++)cout << Heap[i].val << " ";
cout << '\n';
}
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;
}