Pagini recente » Cod sursa (job #3311913) | Cod sursa (job #2075684) | Cod sursa (job #1399706) | Cod sursa (job #1399722) | Cod sursa (job #3320959)
#include <fstream>
#include <vector>
#include <utility>
#include <climits>
using namespace std;
ifstream be("heapuri.in");
ofstream ki("heapuri.out");
void up(vector<pair<int, int>> &h, vector<int> &order, int pos)
{
if(pos == 0)
{
return;
}
int dad = (pos - 1) / 2;
if(h[dad].first > h[pos].first)
{
swap(h[dad], h[pos]);
swap(order[h[dad].second], order[h[pos].second]);
up(h, order, dad);
}
return;
}
void down(vector<pair<int, int>> &h, vector<int> &order, int pos)
{
int children1 = 2 * pos + 1;
if(children1 > (int)h.size() - 1)
{
return;
}
int children2 = 2 * pos + 2;
if(children2 > (int)h.size() - 1)
{
if(h[children1].first < h[pos].first)
{
swap(h[children1], h[pos]);
swap(order[h[children1].second], order[h[pos].second]);
down(h, order, children1);
}
}else
{
int min_children = children2;
if(h[children1].first < h[children2].first)
{
min_children = children1;
}
if(h[min_children].first < h[pos].first)
{
swap(h[min_children], h[pos]);
swap(order[h[min_children].second], order[h[pos].second]);
down(h, order, min_children);
}
}
return;
}
void betesz(vector<pair<int, int>> &h, vector<int> &order, int x)
{
h.push_back({x, order.size()});
order.push_back(h.size() - 1);
up(h, order, (int)h.size() - 1);
}
void kivesz(vector<pair<int, int>> &h, vector<int> &order, int cron)
{
h[order[cron]] = h.back();
order[h.back().second] = order[cron];
h.pop_back();
down(h, order, order[cron]);
up(h, order, order[cron]);
}
int main()
{
int n;
be >> n;
int t;
vector<pair<int, int>> h;
vector<int> order;
for(int i = 0; i < n; i++)
{
be >> t;
if(t == 1)
{
int x;
be >> x;
betesz(h, order, x);
}else if(t == 2)
{
int x;
be >> x;
x--;
kivesz(h, order, x);
}else
{
ki << h[0].first << "\n";
}
}
return 0;
}