Pagini recente » Cod sursa (job #2793647) | Cod sursa (job #3261953) | Cod sursa (job #1042245) | Cod sursa (job #2655758) | Cod sursa (job #1817383)
#include <fstream>
#include <utility>
#include <vector>
#define NMAX 200001
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
vector< pair<int, int> > v(NMAX);
vector<int> poz(NMAX);
int nrOfInsertions;
void InsertNode(int &nrOfNodes, int key)
{
v[++nrOfNodes].first = key;
v[nrOfNodes].second = ++nrOfInsertions;
poz[nrOfInsertions] = nrOfNodes;
int son = nrOfNodes, father = nrOfNodes / 2;
while (son > 1 && v[father].first > v[son].first)
{
swap(v[father], v[son]);
swap(poz[v[father].second], poz[v[son].second]);
son = father;
father = son / 2;
}
}
void DeleteNode(int &nrOfNodes, int pozErased)
{
v[poz[pozErased]] = v[nrOfNodes];
poz[v[nrOfNodes].second] = poz[pozErased];
--nrOfNodes;
int node = poz[pozErased];
int father = node / 2;
while (node > 1 && v[father].first > v[node].first)
{
swap(v[node], v[father]);
swap(poz[v[node].second], poz[v[father].second]);
node = father;
father = node / 2;
}
int son = 0;
do
{
if (2 * node <= nrOfNodes)
son = 2 * node;
if (son + 1 <= nrOfNodes && v[son].first > v[son + 1].first)
son = son + 1;
if (v[son].first >= v[node].first)
son = 0;
if (son)
{
swap(v[son], v[node]);
swap(poz[v[son].second], poz[v[node].second]);
node = son;
}
} while (son);
}
int main()
{
int n, p, x, nr = 0;
f >> n;
for (int i = 1; i <= n; ++i)
{
f >> p;
if (p == 1)
{
f >> x;
InsertNode(nr, x);
}
else if (p == 2)
{
f >> x;
DeleteNode(nr, x);
}
else
g << v[1].first << "\n";
}
return 0;
}