Pagini recente » Cod sursa (job #2075922) | Cod sursa (job #2086315) | Cod sursa (job #576897) | Cod sursa (job #2574797) | Cod sursa (job #972460)
Cod sursa(job #972460)
#include <fstream>
#include <vector>
#include <utility>
class Heap
{
std::vector<int> myP;
std::vector<std::pair<int, int> > myV;
public:
void heapify(int i)
{
int r1 = 2 * i + 1, r2 = 2 * i + 2, comp = i;
if(r1 <= myV.size() - 1)
if(myV[r1].first < myV[comp].first) comp = r1;
if(r2 <= myV.size() - 1)
if(myV[r2].first < myV[comp].first) comp = r2;
if(comp != i)
{
std::swap(myV[i], myV[comp]);
myP[myV[i].second] = i;
myP[myV[comp].second] = comp;
heapify(comp);
}
}
void insert(int a)
{
myP.push_back(0);
myV.push_back(std::make_pair(a, myP.size() - 1));
myP[myV.back().second] = myV.size() - 1;
if(myV.size() == 1) return;
int i;
if(myV.size() - 1 % 2 == 0) i = (myV.size() - 1) / 2 - 1;
else i = (myV.size() - 1) / 2;
if(myV[i] > myV[myV.size() - 1])
{
int n = myV.size() - 1;
std::swap(myV[i], myV[n]);
myP[myV[i].second] = i;
myP[myV[n].second] = n;
siftup(i);
}
}
void siftup(int a)
{
if(!a) return;
int i;
if(a % 2 == 0) i = a / 2 - 1;
else i = a / 2;
if(myV[i].first > myV[a].first)
{
std::swap(myV[i], myV[a]);
myP[myV[i].second] = i;
myP[myV[a].second] = a;
siftup(i);
}
}
void del(int i)
{
i = myP[i];
if(i == myV.size() - 1)
{
myV.pop_back();
return;
}
myV[i] = myV.back();
myP[myV[i].second] = i;
myV.pop_back();
heapify(i);
}
int top()
{
return myV[0].first;
}
};
int main(void)
{
std::ofstream out("heapuri.out");
std::ifstream in("heapuri.in");
Heap c;
int nO, a, b;
in >> nO;
for(int i(0); i < nO; i++)
{
in >> a;
if(a == 1)
{
in >> b;
c.insert(b);
}
if(a == 2)
{
in >> b;
b--;
c.del(b);
}
if(a == 3)
{
out << c.top() << "\n";
}
}
return 0;
}