Pagini recente » Cod sursa (job #1381150) | Cod sursa (job #1139134) | Cod sursa (job #5873) | Cod sursa (job #385010) | Cod sursa (job #656151)
Cod sursa(job #656151)
#include<fstream>
#include<algorithm>
#define NMAX 200001
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int N, Value[NMAX], Pos[NMAX], Heap[NMAX], Heap_size=0;
inline void Swap(int X, int Y)
{
swap(Pos[Heap[X]],Pos[Heap[Y]]);
swap(Heap[X],Heap[Y]);
}
void Sift(int X)
{
int left_son = (X<<1);
int right_son = left_son+1;
int minim;
if(left_son <= Heap_size and Value[Heap[left_son]] < Value[Heap[X]])
minim = left_son;
else minim = X;
if(right_son <= Heap_size and Value[Heap[right_son]] < Value[Heap[minim]])
minim = right_son;
if(minim!=X)
{
Swap(minim, X);
Sift(X);
}
}
void Percolate(int X)
{
int Father = (X>>1);
if(Father > 0 and Value[Heap[X]] < Value[Heap[Father]])
{
Swap(X,Father);
Percolate(Father);
}
}
void Insert(int X)
{
Heap[++Heap_size] = X;
Pos[X] = Heap_size;
Percolate(Pos[X]);
}
void Delete(int X)
{
Swap(X, Heap_size);
Pos[Heap[Heap_size]]=0;
Heap[Heap_size]=0;
--Heap_size;
Sift(X);
}
int main()
{
int M, cod,x;
in>>M;
for(int i = 1; i <= M; i++)
{
in >> cod;
if(cod == 1)
{
++N;
in >> Value[N];
Insert(N);
}
else if(cod == 2)
{
in >> x;
Delete(Pos[x]);
}
else
out << Value[Heap[1]] <<'\n';
}
}