Pagini recente » Cod sursa (job #2198419) | Cod sursa (job #2622728) | Cod sursa (job #2407517) | Rating Clapa Alexandra (alexandraclapa) | Cod sursa (job #1169528)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int MAXN=200005;
int M,N,v;
int Heap[MAXN], Pos[MAXN],V[MAXN];
inline int leftSon(int k)
{
return 2*k;
}
inline int rightSon(int k)
{
return 2*k+1;
}
inline int Father(int k)
{
return k/2;
}
inline int Query()
{
return V[Heap[1]];
}
inline void Percolate(int k)
{
while(k>1 && V[Heap[k]]<V[Heap[Father(k)]])
{
swap(Heap[Father(k)],Heap[k]);
Pos[Heap[k]]=k;
Pos[Heap[Father(k)]]=Father(k);
k=Father(k);
}
}
inline void Sift(int k)
{
int son = 0;
do
{
son=0;
if(leftSon(k)<=N)
{
son=leftSon(k);
if(rightSon(k)<=N&&V[Heap[son]] > V[Heap[rightSon(k)]])
son=rightSon(k);
if(V[Heap[k]]<=V[Heap[son]]) son=0;
}
if(son)
{
swap(Heap[son],Heap[k]);
Pos[Heap[son]]=son;
Pos[Heap[k]]=k;
k=son;
}
}
while(son);
}
inline void Erase(int k) //Stergere element
{
Heap[Pos[k]]=Heap[N];
N-=1;
Percolate(Pos[k]);
Sift(Pos[k]);
}
inline void Insert(int x) //Adaugare element
{
V[++v]=x;
Heap[++N]=v;
Pos[v]=N;
Percolate(N);
}
int main()
{
fin>>M;
for(int i=1;i<=M;i++)
{
int op,x;
fin>>op;
if(op==1)
{
fin>>x;
Insert(x);
}
if(op==2)
{
fin>>x;
Erase(x);
}
if(op==3)
fout<<Query()<<'\n';
}
return 0;
}