Pagini recente » Cod sursa (job #2267760) | Cod sursa (job #4409) | Cod sursa (job #2545090) | Cod sursa (job #1433121) | Cod sursa (job #3175006)
#include <bits/stdc++.h>
#define NM 200002
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int n, H[NM], m, poz[NM];
void afisare()
{
int i;
for (i=1; i<=n; i++)
cout << poz[i] << ' ';
cout << '\n';
}
void combinare (int p);
void inserare(int x);
void stergere (int i);
int main()
{
fin >> m;
int i, c, x;
for (i=1; i<=m; i++)
{
fin >> c;
if (c == 1)
{
fin >> x;
inserare(x);
}
if (c == 2)
{
fin >> x;
stergere(x);
}
if (c == 3)
{
fout << H[1] << '\n';
}
afisare();
}
return 0;
}
void inserare (int x)
{
int fiu, tata;
fiu = n+1;
tata = fiu/2;
while (tata > 0 && H[tata] > x)
{
poz[fiu] = poz[tata];
H[fiu] = H[tata];
fiu = tata;
tata = fiu/2;
}
n ++;
poz[fiu] = n;
H[fiu] = x;
}
void stergere (int i)
{
int cnt;
for (int j = 1; j <= n; j ++)
if (poz[j] == i)
{
cnt = j;
break;
}
H[cnt] = H[n--];
poz[cnt] = poz[n];
combinare(cnt);
}
void combinare (int p)
{
int tata, fiu, x;
x = H[p];
tata = p;
fiu = 2*tata;
while (fiu <= n)
{
if (fiu+1 <= n && H[fiu+1] < H[fiu])fiu++;
if (H[fiu] < x)
{
poz[tata]= poz[fiu];
H[tata] = H[fiu];
tata = fiu;
fiu = 2*tata;
}
else break;
}
poz[tata] = poz[x];
H[tata] = x;
}