Pagini recente » Cod sursa (job #1474698) | Cod sursa (job #1598015) | Cod sursa (job #1676319) | Cod sursa (job #1513179) | Cod sursa (job #2894646)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
vector<pair<pair<int, int>, int>> v; //<<index cronologic, valoare>, prezent in heap>
int i, n, op, elem, nrElem;
void urca(int poz)
{
int tata;
while(true)
{
tata = (poz - 1) / 2;
if(v[tata].first.second > v[poz].first.second)
{
swap(v[tata], v[poz]);
poz = tata;
}
else
break;
}
}
void coboara(int poz)
{
int fiuSt;
if(!(poz * 2 + 1 >= v.size())) //adica fiul sau din stanga exista deci are unde cobora
{
fiuSt = v[poz * 2 + 1].first.second;
if(poz * 2 + 2 == v.size() || fiuSt < v[poz * 2 + 2].first.second) //adica daca nu are fiu drept sau fiul stang e mai mare decat dreptul
{
if(fiuSt < v[poz].first.second)
{
swap(v[poz], v[poz * 2 + 1]);
coboara(poz * 2 + 1);
}
}
else if(v[poz * 2 + 2].first.second < v[poz].first.second)
{
swap(v[poz], v[poz * 2 + 2]);
coboara(poz * 2 + 2);
}
}
}
void elimVarf()
{
v[0] = v[v.size() - 1];
v.pop_back();
coboara(0);
}
void inserare(int x, int poz)
{
v.push_back(make_pair(make_pair(poz, x), 1));
urca(v.size() - 1);
}
void sterge(int poz)
{
for(int j = 0; j < v.size(); j++)
if(v[j].first.first == poz)
{
v[j].second = 0;
break;
}
}
int main()
{
in>>n;
for(i = 1; i <= n; i++)
{
in>>op;
while(!v.empty() && v[0].second == 0)
elimVarf();
if(op == 1)
{
in>>elem;
nrElem++;
inserare(elem, nrElem);
}
else if(op == 2)
{
in>>elem;
sterge(elem);
}
else
out<<v[0].first.second<<'\n';
/*{for(int j = 0; j < v.size(); j++)
cout<<v[j].first.second<<" "<<v[j].first.first<<" "<<v[j].second<<" ";
cout<<endl;}*/
}
return 0;
}