Pagini recente » Cod sursa (job #470454) | Cod sursa (job #497351) | Cod sursa (job #345316) | Cod sursa (job #1492781) | Cod sursa (job #2896062)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<long long, long long>> v;
vector<long long> p(200001);
void schimb(long long old, long long neww)
{
swap(v[old], v[neww]);
swap(p[v[old].second], p[v[neww].second]);
}
void sus(long long pozitie)
{
while ((pozitie - 1) / 2 >= 0 and v[(pozitie - 1) / 2].first > v[pozitie].first)
{
schimb((pozitie - 1) / 2, pozitie);
pozitie = (pozitie - 1) / 2;
}
}
void jos(long long pozitie)
{
if (v.size() <= pozitie * 2 + 1)
{
return;
}
long long pozMin = pozitie * 2 + 1;
if (v.size() > pozitie * 2 + 2)
{
pozMin = (v[pozitie * 2 + 1].first < v[pozitie * 2 + 2].first) ? pozitie * 2 + 1 : pozitie * 2 + 2;
}
if (v[pozitie].first < v[pozMin].first)
return;
schimb(pozitie, pozMin);
jos(pozitie);
}
int main()
{
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
long long n, rdcn, pozSterge, lgr, mrm;
cin >> n;
long long x = 0, add, pozz;
for (long long i = 0; i < n; i++)
{
cin >> lgr;
cout << i << ' ' << lgr << endl;
if (lgr == 1)
{
cin >> add;
v.push_back(make_pair(add, x));
p[x] = v.size() - 1;
sus(v.size() - 1);
x++;
}
else if (lgr == 2)
{
cin >> pozSterge;
pozSterge--;
if (p[pozSterge] == v.size() - 1)
{
p[pozSterge] = -1;
v.pop_back();
continue;
}
pozz = p[pozSterge];
p[v.back().second] = p[pozSterge];
v[pozz] = v.back();
v.pop_back();
p[pozSterge] = -1;
sus(pozz);
jos(pozz);
}
else
{
cout << v[0].first << "\n";
}
}
}