Pagini recente » Monitorul de evaluare | Cod sursa (job #2639387) | Cod sursa (job #3283521) | Cod sursa (job #3179502) | Cod sursa (job #2747264)
#include <bits/stdc++.h>
using namespace std;
int n, indice[200001], poz[200001],tata[200001];
void schimba(int a, int b)
{
swap(tata[a], tata[b]);
swap(indice[a], indice[b]);
poz[indice[a]] = a;
poz[indice[b]] = b;
}
void urcare(int a)
{
if (a == 1)
return;
if (tata[a / 2] > tata[a])
{
schimba(a, a / 2);
urcare(a / 2);
}
}
void coboarare(int a)
{
int b = 0;
if (2 * a <= n)
{
b = 2 * a;
if (2 * a + 1 <= n && tata[2 * a + 1] < tata[2 * a]) {
b = 2 * a + 1;
}
}
if (b > 0 && tata[b] < tata[a])
{
schimba(a, b);
coboarare(b);
}
}
void rearanjare(int a) {
if (a > 1 && tata[a / 2] > tata[a])
{
urcare(a);
} else
{
coboarare(a);
}
}
int main()
{
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int element,ok, i=0,optiune,j;
fin >> ok;
while (ok!=0)
{
fin >> optiune;
if (optiune == 1)
{ fin>>element;
i++;
n++;
tata[n] = element;
indice[n] = i;
poz[i] = n;
urcare(n);
}
else if (optiune == 2)
{
fin>>element;
j = poz[element];
schimba(n, j);
n--;
rearanjare(j);
}
else
fout << tata[1]<<"\n";
ok--;
}
return 0;
}