Pagini recente » Cod sursa (job #972374) | Cod sursa (job #2000206) | Cod sursa (job #2720550) | Cod sursa (job #1344241) | Cod sursa (job #2805870)
#include <fstream>
#define N 200012
using namespace std;
int heap[N], where[N], intr[N], cate;
void down(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])
{
swap(heap[i], heap[son]);
alc = where[son];
intr[alc] = i;
intr[ord] = son;
where[i] = alc;
where[son] = ord;
i = son;
}
else
son = 0;
} while (son != 0);
}
void up(int x, int i, int ord)
{
int alc;
while (i > 1 && x < heap[i / 2])
{
swap(heap[i], heap[i / 2]);
alc = where[i / 2];
intr[alc] = i;
intr[ord] = i / 2;
where[i] = alc;
where[i / 2] = ord;
i /= 2;
}
}
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])
up(heap[i], i, ord);
else
down(heap[i], i, ord);
}
void put(int x, int i, int ord)
{
heap[i] = x;
intr[ord] = i;
where[i] = ord;
up(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, n;
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;
}