Pagini recente » Cod sursa (job #1806106) | Cod sursa (job #1741492) | Cod sursa (job #2437067) | Cod sursa (job #136880) | Cod sursa (job #2953168)
#include <fstream>
#include <map>
#define NMAX 200008
///min-heap
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int n;
int H[NMAX], p[NMAX], elp[NMAX], cnt;
map <int, int> M;
void creare(int H[], int& n);
void inserare(int H[], int& n, int x);
void combinare(int H[], int& n, int i);
int main()
{
ios_base::sync_with_stdio(0); fin.tie(0);
creare(H, n);
return 0;
}
void creare(int H[], int& n)
{
int nr;
fin >> nr;
n = 0;
for (int i = 0; i < nr; i++)
{
int x, op, ok;
fin >> op;
if (op == 1)
{
fin >> x;
M[x] = ++cnt;
elp[cnt] = x;
p[cnt] = n+1;
inserare(H, n, x);
}
else if (op == 3)
{
fout << H[1] << '\n';
}
else
{
fin >> x;
combinare(H, n, p[M[elp[x]]]);
}
}
}
void inserare(int H[], int& n, int x)
{
int poz = n + 1, tpoz = poz / 2;
while (tpoz > 0 && H[tpoz] > x)
{
H[poz] = H[tpoz];
p[M[H[poz]]] = poz;
poz = tpoz;
tpoz = poz / 2;
}
H[poz] = x;
p[M[x]] = poz;
n++;
}
void combinare(int H[], int& n, int i)
///combin heap-urile corecte cu radacinile 2i si 2i+1 cu nodul i
{
p[M[H[n]]] = i;
H[i] = H[n--];
int x = H[i], tata = i, fiu = 2*i, t = i/2;
if (t > 0 && H[t] > x)
{
while (t > 0 && H[t] > x)
{
H[tata] = H[t];
p[M[H[tata]]] = tata;
tata = t;
t = tata/2;
}
}
while (fiu <= n)
{
///daca exista fiu drept si e mai mic
if (fiu + 1 <= n && H[fiu+1] < H[fiu]) fiu++;
if (H[fiu] < x)
{
H[tata] = H[fiu];
p[M[H[fiu]]] = tata;
tata = fiu;
fiu = fiu * 2;
}
else
break;
}
H[tata] = x;
p[M[x]] = tata;
}