Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1202308) | Cod sursa (job #2965252) | Cod sursa (job #3318259)
#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;
int size = 0;
for(int i = 0; i < n; i++)
{
be >> t;
if(t == 1)
{
be >> x;
h.push_back({x, size});
order.push_back(size);
int k = (size - 1) / 2;
int current = size;
while(current > 0)
{
if(h[k] < h[current])
{
swap(h[k], h[current]);
swap(order[h[k].second], order[h[current].second]);
}else
{
break;
}
current = k;
k = (current - 1) / 2;
}
size++;
}else if(t == 2)
{
be >> x;
x--;
h[order[x]] = h.back();
order[h.back().second] = order[x];
h.pop_back();
size--;
int k = order[x];
while(2 * k + 1 < size)
{
int c1 = 2 * k + 1;
int c2 = -1;
if(2 * k + 2 < size)
{
c2 = 2 * k + 2;
}
int maximum;
if(c2 == -1 || h[c1] >= h[c2])
{
maximum = c1;
}else
{
maximum = c2;
}
if(h[maximum] > h[k])
{
swap(h[maximum], h[k]);
swap(order[h[maximum].second], order[h[k].second]);
}else
{
break;
}
if(maximum == c1)
{
k = 2 * k + 1;
}else
{
k = 2 * k + 2;
}
}
}else
{
int minimum = INT_MAX;
for(pair<int, int> i : h)
{
minimum = min(minimum, i.first);
}
ki << minimum << "\n";
}
}
return 0;
}