Pagini recente » Cod sursa (job #3128224) | Cod sursa (job #1688339) | Cod sursa (job #1125609) | Cod sursa (job #713890) | Cod sursa (job #2365967)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int NMAX = 200005;
int N;
int heapSize, heap[NMAX];
int nrIns, inserted[NMAX];
int pos[NMAX];
void Insert(int val)
{
inserted[++nrIns] = ++heapSize;
heap[heapSize] = val;
pos[heapSize] = nrIns;
int p = heapSize;
while(p > 1)
{
int son = p >> 1;
if(heap[son] >= heap[p])
{
swap(inserted[pos[son]], inserted[pos[p]]);
swap(pos[son], pos[p]);
swap(heap[son], heap[p]);
p = son;
}
else
break;
}
}
void Delete(int posDelete)
{
swap(inserted[pos[posDelete]], inserted[pos[heapSize]]);
swap(pos[posDelete], pos[heapSize]);
swap(heap[posDelete], heap[heapSize]);
heapSize--;
int p = posDelete;
while(p < heapSize)
{
int sonLeft = p << 1;
int sonRight = p << 1 + 1;
if(sonLeft > heapSize)
break;
int preferredSon;
if(sonRight > heapSize)
preferredSon = sonLeft;
else if(heap[sonLeft] < heap[sonRight])
preferredSon = sonLeft;
else
preferredSon = sonRight;
if(heap[p] >= heap[preferredSon])
{
swap(inserted[pos[p]], inserted[pos[preferredSon]]);
swap(pos[p], pos[preferredSon]);
swap(heap[p], heap[preferredSon]);
p = preferredSon;
}
else
break;
}
}
int Head()
{
return heap[1];
}
int main()
{
fin >> N;
int type, x;
for(int i = 1; i <= N; i++)
{
fin >> type;
if(type == 1)
{
fin >> x;
Insert(x);
}
else if(type == 2)
{
fin >> x;
Delete(inserted[x]);
}
else
fout << Head() << '\n';
}
return 0;
}