Pagini recente » Cod sursa (job #1270695) | Cod sursa (job #1079774) | Cod sursa (job #2744859) | Cod sursa (job #763537) | Cod sursa (job #2894661)
#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>
vector<int> pozIndici; //retinem pozitiile pe care se afla in heap fiecare indice ca sa nu mai cautam, sunt mai 200k operatii deci max 200k indici
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]);
pozIndici[v[tata].first] = tata;
pozIndici[v[poz].first] = poz;
poz = tata;
}
else
{
pozIndici[v[poz].first] = poz;
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]);
pozIndici[v[poz * 2 + 1].first] = poz * 2 + 1;
pozIndici[v[poz].first] = poz;
coboara(poz * 2 + 1);
}
else
pozIndici[v[poz].first] = poz;
}
else if(v[poz * 2 + 2].second < v[poz].second)
{
swap(v[poz], v[poz * 2 + 2]);
pozIndici[v[poz * 2 + 2].first] = poz * 2 + 2;
pozIndici[v[poz].first] = poz;
coboara(poz * 2 + 2);
}
pozIndici[v[poz].first] = poz;
}
}
void inserare(int x, int poz)
{
v.push_back(make_pair(poz, x));
urca(v.size() - 1);
}
void sterge(int indice)
{
int poz = pozIndici[indice];
v[poz] = v[v.size() - 1];
v.pop_back();
coboara(poz);
urca(poz);
}
int main()
{
in>>n;
pozIndici.resize(n + 1);
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;
}