Pagini recente » Diferente pentru utilizator/dutzucky intre reviziile 1 si 3 | Cod sursa (job #2423478)
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n, q, o, t, heap[N], v[N], poz[N];
void heap_up(int), heap_down(int), heap_swap(int, int);
int main()
{
f >> q;
for(; q; q--)
{
f >> o;
if(o == 1)
{
t++;
f >> v[t];
n++;
heap[n] = t;
poz[t] = n;
heap_up(n);
}
else if(o == 2)
{
int p;
f >> p;
p = poz[p];
heap_swap(p, n);
n--;
heap_up(p);
heap_down(p);
}
else
g << v[heap[1]] << '\n';
}
return 0;
}
void heap_up(int fiu)
{
int tata = fiu/2;
if(!tata)
return;
if(v[heap[fiu]] < v[heap[tata]])
{
heap_swap(tata, fiu);
heap_up(tata);
}
}
void heap_down(int tata)
{
int fiu = tata * 2;
if(fiu > n)
return;
if(fiu < n)
{
if(v[heap[fiu]] > v[heap[fiu + 1]])
fiu++;
}
if(v[heap[fiu]] < v[heap[tata]])
{
heap_swap(tata, fiu);
heap_down(fiu);
}
}
void heap_swap(int i, int j)
{
swap(heap[i], heap[j]);
poz[heap[i]] = i;
poz[heap[j]] = j;
}