Pagini recente » Cod sursa (job #2787771) | Cod sursa (job #1214500) | Cod sursa (job #990833) | Cod sursa (job #93911) | Cod sursa (job #1213623)
#include <fstream>
using namespace std;
void solve();
void push(int pos);
void pop(int pos);
int L,NR, A[200005], Heap[200005], Pos[200005];
int main()
{
solve();
return 0;
}
void solve()
{
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int c,n,val,pos;
L = NR = 0;
fin>>n;
for(int i=0;i<n;i++)
{
fin>>c;
if(c == 1)
{
fin>>val;
++L; //lungimea heapului
++NR; //lungimea vectorului cu valori
A[NR] = val; //adaugarea valorii la capatul vectorului
Heap[L] = NR; //adaugarea indicelui valorii in heap
Pos[NR] = L; //adaugarea pozitiei in heap a indicelui valorii
push(L);
}
else if(c == 2)
{
fin>>pos;
A[pos] = -1;
push(Pos[pos]);
Pos[Heap[1]] = 0; //<=> Pos[pos] = 0;
Heap[1] = Heap[L];
L--;
Pos[Heap[1]] = 1;
if(L>1)
{
pop(1);
}
}
else if(c == 3)
{
fout<<A[Heap[1]]<<'\n';
}
}
}
void push(int pos)
{
while((pos/2 > 0) && (A[Heap[pos]] < A[Heap[pos/2]]))
{
int temp = Heap[pos];
Heap[pos] = Heap[pos / 2];
Heap[pos / 2] = temp;
Pos[Heap[pos]] = pos;
Pos[Heap[pos/2]] = pos/2;
pos = pos / 2;
}
}
void pop(int pos)
{
int parent = 0;
while(pos != parent)
{
parent = pos;
if((parent*2 <= L) && A[Heap[pos]]>A[Heap[parent*2]])
{
pos = parent * 2;
}
if((parent*2+1 <= L) && A[Heap[pos]]>A[Heap[parent*2+1]])
{
pos = parent*2+1;
}
int temp = Heap[parent];
Heap[parent] = Heap[pos];
Heap[pos] = temp;
Pos[Heap[parent]] = parent;
Pos[Heap[pos]] = pos;
}
}