Pagini recente » Cod sursa (job #2256761) | Cod sursa (job #2250165) | Cod sursa (job #2343798) | Cod sursa (job #1905255) | Cod sursa (job #521488)
Cod sursa(job #521488)
#include <fstream>
#define ll long long
#define maxn 200010
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
long long n, val[maxn], heap[maxn], poz_heap[maxn], x, m, y;
void push(int nod)
{
ll aux;
while(val[heap[nod]] < val[heap[nod / 2]] && nod / 2)
{
aux = heap[nod];
heap[nod] = heap[nod / 2];
heap[nod / 2] = aux;
poz_heap[heap[nod]] = nod;
poz_heap[heap[nod / 2]] = nod / 2;
nod /= 2;
}
}
void inserare()
{
f >> x;
y++;
m++;
val[m] = x;
heap[y] = m;
poz_heap[m] = y;
push(y);
}
void scufunda(int nod)
{
ll aux;
while((val[heap[nod]] > val[heap[nod * 2]] || val[heap[nod]] > val[heap[nod * 2 + 1]] ) && nod * 2 <= m)
if(val[heap[nod * 2]] <= val[heap[nod * 2 + 1]])
{
aux = heap[nod];
heap[nod] = heap[nod * 2];
heap[nod * 2] = aux;
poz_heap[heap[nod]] = nod;
poz_heap[heap[nod * 2]] = nod * 2;
nod *= 2;
}
else
{
aux = heap[nod];
heap[nod] = heap[nod * 2 + 1];
heap[nod * 2 + 1] = aux;
poz_heap[heap[nod]] = nod;
poz_heap[heap[nod * 2 + 1]] = nod * 2 + 1;
nod = nod * 2 + 1;
}
}
void sterge()
{
f >> x;
ll poz = poz_heap[x];
heap[poz] = heap[m];
poz_heap[heap[poz]] = poz_heap[heap[m]];
--m;
scufunda(poz);
}
int main()
{
f >> n;
for(int i = 1; i <= n; ++i)
{
int cod;
f >> cod;
if(cod == 1) inserare();
if(cod == 2) sterge();
if(cod == 3) g << val[heap[1]] << '\n';
}
/*for(int i = 1; i <= 4; ++i)
cout << val[i] << " ";
cout << '\n';
for(int i = 1; i <= 4; ++i)
cout << heap[i] << " ";
cout << '\n';
for(int i = 1; i <= 4; ++i)
cout << poz_heap[i] << " ";
cout << '\n';
*/
f.close();
g.close();
return 0;
}