Pagini recente » Borderou de evaluare (job #2116784) | Cod sursa (job #2019355) | Cod sursa (job #933546) | Cod sursa (job #1665639) | Cod sursa (job #2805871)
#include <fstream>
#define N 200012
using namespace std;
int heap[N], where[N], intr[N], n, cate;
void sift(int x, int i, int ord)
{
int son, alc;
do
{
son = 0;
if (2 * i <= cate)//are fiu stang
{
son = 2 * i;
if (2 * i + 1 <= cate && heap[2 * i + 1] < heap[2 * i])
son = 2 * i + 1;
}
if (son && x > heap[son])
{
heap[i] = heap[son];
alc = where[son];
intr[alc] = i;
where[i] = alc;
i = son;
}
else
son = 0;
} while (son != 0);
heap[i] = x;
where[i] = ord;
intr[ord] = i;
}
void percolate(int x, int i, int ord)
{
int alc;
while (i > 1 && x < heap[i / 2])
{
heap[i] = heap[i / 2];
alc = where[i / 2];
intr[alc] = i;
where[i] = alc;
i /= 2;
}
heap[i] = x;
intr[ord] = i;
where[i] = ord;
}
void cut(int ord)
{
int i = intr[ord];
heap[i] = heap[cate];
ord = where[cate];
intr[ord] = i;
where[i] = ord;
--cate;
if (i > 1 && heap[i] < heap[i / 2])
percolate(heap[i], i, ord);
else
sift(heap[i], i, ord);
}
void put(int x, int i, int ord)
{
heap[i] = x;
intr[ord] = i;
where[i] = ord;
percolate(x, i, ord);///cand inserezi valoarea e pusa tot timpul ultima si atunci compari mereu doar cu tata
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int x, cod, ord = 0, which, i = 0;
f >> n;
for (int k = 1;k <= n;++k)
{
f >> cod;
if (cod == 1)
{
f >> x;
put(x, ++cate, ++ord);
}
else
if (cod == 2)
{
f >> which;
cut(which);
}
else
g << heap[1] << "\n";
}
f.close();
g.close();
return 0;
}