Pagini recente » Cod sursa (job #3312057) | Borderou de evaluare (job #1547914) | Cod sursa (job #846624) | Cod sursa (job #3314219) | Cod sursa (job #3318296)
#include <fstream>
#include <vector>
#include <utility>
#include <climits>
using namespace std;
ifstream be("heapuri.in");
ofstream ki("heapuri.out");
int main()
{
int n;
be >> n;
int t, x;
vector<pair<int, int>> h;
vector<int> order;
for(int i = 0; i < n; i++)
{
be >> t;
if(t == 1)
{
be >> x;
h.push_back({x, h.size()});
order.push_back(h.size() - 1);
int current = h.size() - 1;
while(current > 0)
{
int k = (current - 1) / 2;
if(h[k] > h[current])
{
swap(h[k], h[current]);
swap(order[h[k].second], order[h[current].second]);
}
current = k;
k = (k - 1) / 2;
}
}else if(t == 2)
{
be >> x;
x--;
int current = order[x];
h[current] = h.back();
order[h.back().second] = current;
h.pop_back();
while(2 * current + 1 <= (int)h.size() - 1)
{
int c1 = 2 * current + 1;
int c2 = INT_MAX;
if(2 * current + 2 <= (int)h.size() - 1)
{
c2 = 2 * current + 2;
}
int minimum = min(c1, c2);
swap(h[current], h[minimum]);
swap(order[h[current].second], order[h[minimum].second]);
current = minimum;
}
}else
{
ki << h[0].first << "\n";
}
}
return 0;
}