Pagini recente » Cod sursa (job #459047) | Cod sursa (job #1055669) | Cod sursa (job #2028107) | Cod sursa (job #1937944) | Cod sursa (job #972094)
Cod sursa(job #972094)
#include <fstream>
#include <vector>
#include <map>
class Heap
{
std::vector<int> myV;
std::map<int, int> myM;
public:
void heapify(int i)
{
int left = 2 * i + 1, right = 2 * i + 2, j = i;
if(left < myV.size() && myV[left] < myV[j]) std::swap(left, j);
if(right < myV.size() && myV[right] < myV[j]) std::swap(right, j);
if(j != i)
{
myM[myV[i]] = j;
myM[myV[j]] = i;
std::swap(myV[i], myV[j]);
heapify(j);
}
}
void insert(int a)
{
myV.push_back(a);
int i = myV.size() - 1;
myM[a] = i;
while(i)
{
int j;
if(i % 2 == 0) j = i / 2 - 1;
else j = i / 2;
if(myV[i] < myV[j])
{
myM[myV[i]] = j;
myM[myV[j]] = i;
std::swap(myV[i], myV[j]);
i = j;
}
else break;
}
}
void del(int a)
{
myV[myM[a]] = myV.back();
myM[myV.back()] = myM[a];
myV.pop_back();
heapify(myM[a]);
myM[a] = -1;
}
int min()
{
return myV[0];
}
};
int main()
{
std::ofstream out("heapuri.out");
std::ifstream in("heapuri.in");
std::vector<int> myV;
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);
myV.push_back(b);
}
if(a == 2)
{
in >> b;
b--;
c.del(myV[b]);
}
if(a == 3)
{
out << c.min() << std::endl;
}
}
return 0;
}