Pagini recente » Cod sursa (job #1975461) | Cod sursa (job #1739582)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int maxn = 200005;
struct pereche
{
int val, p;
};
pereche v[maxn];
int pozitii[maxn];
int n, cnt;
void up(int poz)
{
if(poz / 2 == 0)
return;
if(v[poz].val < v[poz / 2].val)
{
pozitii[v[poz].p] = poz / 2;
pozitii[v[poz / 2].p] = poz;
swap(v[poz], v[poz / 2]);
up(poz / 2);
}
return;
}
void add(int x)
{
v[++n].val = x;
v[n].p = cnt;
pozitii[cnt] = n;
up(n);
}
void down(int poz)
{
int next = poz * 2;
if(next > n)
return;
if(next < n && v[next].val > v[next + 1].val)
next++;
if(next <= n && v[poz].val > v[next].val)
{
pozitii[v[poz].p] = next;
pozitii[v[next].p] = poz;
swap(v[poz], v[next]);
down(next);
}
return;
}
void sterge(int pos)
{
int poz = pozitii[pos];
swap(pozitii[v[n].p], pozitii[pos]);
swap(v[n], v[poz]);
n--;
up(poz);
down(poz);
}
int main()
{
int nrop;
in >> nrop;
int x;
for(int l = 1; l <= nrop; l++)
{
int op;
in >> op;
if(op == 1)
{
cnt++;
in >> x;
add(x);
}
else if(op == 2)
{
in >> x;
sterge(x);
}
else
out << v[1].val << "\n";
}
return 0;
}