Pagini recente » Cod sursa (job #3290550) | Cod sursa (job #847333) | Cod sursa (job #1525607) | Cod sursa (job #854243) | Cod sursa (job #2815229)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
vector <int> heap(1, 0), poz(1, 0), v(1, 0);
int k;
const int NMAX = 200005;
bool empty()
{
return (heap.size() == 1);
}
void insert(int x)
{
int pos = v.size();
heap.push_back(pos);
v.push_back(x);
poz.push_back(heap.size() - 1);
pos = heap.size() - 1;
while(pos > 1)
{
if(v[heap[pos]] < v[heap[pos / 2]])
{
swap(heap[pos], heap[pos / 2]);
swap(poz[heap[pos]], poz[heap[pos / 2]]);
}
else
break;
pos = pos / 2;
}
}
void pop(int x)
{
int pos = poz[x], ok = 1, aux;
swap(heap[pos], heap[heap.size() - 1]);
swap(poz[heap[pos]], poz[heap[heap.size() - 1]]);
poz[heap[heap.size() - 1]] = 0;
heap.pop_back();
aux = pos;
while(pos > 1)
{
if(v[heap[pos]] < v[heap[pos / 2]])
{
swap(heap[pos], heap[pos / 2]);
swap(poz[heap[pos]], poz[heap[pos / 2]]);
}
else
break;
pos = pos / 2;
}
pos = aux;
int pos_min;
while(pos * 2 < heap.size())
{
pos_min = 2 * pos;
if(2 * pos + 1 < heap.size() && v[heap[pos_min]] > v[heap[2 * pos + 1]])
pos_min = 2 * pos + 1;
if(v[heap[pos]] <= v[heap[pos_min]])
break;
swap(heap[pos], heap[pos_min]);
swap(poz[heap[pos]], poz[heap[pos_min]]);
pos = pos_min;
}
}
int top()
{
return v[heap[1]];
}
int main()
{
int m, i, op, x;
fin >> m;
while(m--)
{
fin >> op;
if(op == 1)
{
fin >> x;
insert(x);
}
else if(op == 2)
{
fin >> x;
pop(x);
}
else
{
fout << top() << '\n';
}
}
return 0;
}