Pagini recente » Cod sursa (job #853907) | Cod sursa (job #800507) | Cod sursa (job #41427) | Cod sursa (job #1904609) | Cod sursa (job #2894644)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
vector<pair<int, int>> v; //<index cronologic, valoare>
int i, n, op, elem, nrElem;
void urca(int poz)
{
int tata;
while(true)
{
tata = (poz - 1) / 2;
if(v[tata].second > v[poz].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].second;
if(poz * 2 + 2 == v.size() || fiuSt < v[poz * 2 + 2].second) //adica daca nu are fiu drept sau fiul stang e mai mare decat dreptul
{
if(fiuSt < v[poz].second)
{
swap(v[poz], v[poz * 2 + 1]);
coboara(poz * 2 + 1);
}
}
else if(v[poz * 2 + 2].second < v[poz].second)
{
swap(v[poz], v[poz * 2 + 2]);
coboara(poz * 2 + 2);
}
}
}
void inserare(int x, int poz)
{
v.push_back(make_pair(poz, x));
urca(v.size() - 1);
}
void sterge(int poz)
{
for(int j = 0; j < v.size(); j++)
if(v[j].first == poz)
{
v[j] = v[v.size() - 1];
v.pop_back();
coboara(j);
urca(j);
break;
}
}
int main()
{
in>>n;
for(i = 1; i <= n; i++)
{
in>>op;
if(op == 1)
{
in>>elem;
nrElem++;
inserare(elem, nrElem);
}
else if(op == 2)
{
in>>elem;
sterge(elem);
}
else
out<<v[0].second<<'\n';
/* {for(int j = 0; j < v.size(); j++)
cout<<v[j].second<<" "<<v[j].first<<" ";
cout<<endl;}*/
}
return 0;
}