Pagini recente » Cod sursa (job #1410960) | Cod sursa (job #901653) | Cod sursa (job #2907434) | Cod sursa (job #396138) | Cod sursa (job #3127313)
#include <bits/stdc++.h>
#define maxn 200005
int v[maxn] , back = 0, nr = 0; // nr = ordinea cronologica
std::unordered_map<int, int> inHeap; // un unordered_map de la ordinea cronologica la unde se afla in heap
std::unordered_map<int, int> inOrder; // unordered_map de la unde se afla in heap la ordinea cronologica
void heapUp(int pos)
{
if(pos < 1)
return;
if(pos > back)
return;
if(v[pos] < v[pos/2])
{
int temp1 = inOrder[pos], temp2 = inOrder[pos/2], temp3 = inHeap[temp1];
inOrder[pos] = inOrder[pos/2];
inOrder[pos/2] = temp1;
inHeap[temp1] = inHeap[temp2];
inHeap[temp2] = temp3;
std::swap(v[pos], v[pos/2]);
heapUp(pos/2);
}
}
void heapDown(int pos)
{
if(pos < 1)
return;
if(pos > back)
return;
if(2 * pos > back)
return;
int minimum = 2 * pos;
if(2 * pos + 1 <= back && v[2 * pos + 1] < v[2 * pos])
minimum = 2 * pos + 1;
if(v[pos] > v[minimum])
{
int temp1 = inOrder[pos], temp2 = inOrder[minimum], temp3 = inHeap[temp1];
inOrder[pos] = inOrder[minimum];
inOrder[minimum] = temp1;
inHeap[temp1] = inHeap[temp2];
inHeap[temp2] = temp3;
std::swap(v[pos], v[minimum]);
heapDown(minimum);
}
}
void insert(int val)
{
nr++;
v[++back] = val;
// inHeap.insert(nr, back);
inHeap[nr] = back;
inOrder[back] = nr;
heapUp(back);
}
int getMin()
{
if(back < 1)
return 0;
return v[1];
}
void deleteElem(int pos)
{
int deletedElem = inHeap[pos];
int temp1 = inOrder[deletedElem], temp2 = inOrder[back], temp3 = inHeap[temp1];
inOrder[deletedElem] = inOrder[back];
inOrder[back] = temp1;
inHeap[temp1] = inHeap[temp2];
inHeap[temp2] = temp3;
std::swap(v[deletedElem], v[back]);
v[back] = 0;
back--;
if(v[deletedElem] < v[deletedElem/2])
heapUp(deletedElem);
else
heapDown(deletedElem);
}
std::ifstream fin("heapuri.in");
std::ofstream fout("heapuri.out");
int main()
{
int n, x, y;
fin >> n;
for(int i = 0; i < n; ++i)
{
fin >> x;
if(x == 1)
{
fin >> y;
insert(y);
}
else if(x == 2)
{
fin >> y;
deleteElem(y);
}
else{
fout << getMin() << '\n';
}
}
}