Pagini recente » Cod sursa (job #719393) | Cod sursa (job #470273) | Cod sursa (job #575884) | Cod sursa (job #640611) | Cod sursa (job #2474139)
#include <bits/stdc++.h>
#define NMAX 200005
#define maxi 1000000001
using namespace std;
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
int n , x;
int a[NMAX] , poz[NMAX] , poz_heap[NMAX];
short operatie;
int father(int n)
{
return n / 2;
}
int right_son(int n)
{
return 2 * n + 1;
}
int left_son(int n)
{
return 2 * n;
}
void Heap_Up(int &k)
{
int val = a[k];
while(k > 1 && val < a[father(k)])
{
poz_heap[k] = poz_heap[father(k)];
poz[poz_heap[k]] = k;
a[k] = a[father(k)];
k = father(k);
}
a[k] = val;
}
void Heap_Down(int k , int n)
{
int son = 0;
do
{
if(left_son(k) <= n)
{
if(right_son(k) <= n && a[right_son(k)] < a[left_son(k)])
son = right_son(k);
else son = left_son(k);
}
else son = 0;
if(son)
{
poz_heap[k] = poz_heap[son];
poz[poz_heap[k]] = k;
swap(a[son] , a[k]);
k = son;
}
}while(son);
}
int main()
{
int poz_son = 0 , nr = 0;
f >> n;
for(int i = 1 ; i <= n ; i++)
{
f >> operatie;
if(operatie == 1)
{
f >> x;
++nr;
a[nr] = x;
int k = nr;
Heap_Up(k);
poz[nr] = k;
poz_heap[k] = nr;
}
else if(operatie == 2)
{
f >> x;
a[poz[x]] = maxi;
Heap_Down(poz[x] , nr);
}
else g << a[1] << '\n';
}
return 0;
}