Pagini recente » Cod sursa (job #1731366) | Cod sursa (job #117519) | Cod sursa (job #587789) | Istoria paginii utilizator/ghennac | Cod sursa (job #1587445)
#include <stdio.h>
#include <fstream>
#include <algorithm>
using namespace std;
const int NMAX = 200001;
struct node{int key,_rank;};
typedef node Heap[NMAX];
typedef int Rank_Pos[NMAX];
inline int father(int k)
{
return k/2;
}
inline int left_son(int k)
{
return 2*k;
}
inline int right_son(int k)
{
return 2*k+1;
}
inline int minim(Heap H)
{
return H[1].key;
}
void sift(Heap H,int n,int k,Rank_Pos pr)
{
int son;
do
{
son = 0;
if(left_son(k)<=n)
{
son = left_son(k);
if((right_son(k)<=n) && (H[left_son(k)].key > H[right_son(k)].key))
son = right_son(k);
if(H[son].key >= H[k].key)
son = 0;
}
if(son)
{
int order = pr[H[son]._rank];
pr[H[son]._rank] = pr[H[k]._rank];
pr[H[k]._rank] = order;
swap(H[k],H[son]);
k = son;
}
}while(son);
}
void percolate(Heap H,int n,int k,Rank_Pos pr)
{
node aux = H[k];
while(k>1 && H[father(k)].key > aux.key)
{
int order = pr[aux._rank];
pr[aux._rank] = pr[H[father(k)]._rank];
pr[H[father(k)]._rank] = order;
H[k] = H[father(k)];
k = father(k);
}
H[k] = aux;
}
void _insert(Heap H,int &n,int key,int _rank,Rank_Pos pr)
{
H[++n].key = key;
H[n]._rank = _rank;
pr[_rank] = n;
percolate(H,n,n,pr);
}
void cut(Heap H,int &n,int k,Rank_Pos pr)
{
pr[H[k]._rank] = 0;
H[k] = H[n];
pr[H[k]._rank] = k;
n--;
if(k > 1 && H[k].key < H[father(k)].key)
percolate(H,n,k,pr);
else
sift(H,n,k,pr);
}
Heap H;
Rank_Pos pr;
int _size = 0;
int _rank = 0;
int main()
{
int n;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
int type,value;
for(int i=1;i<=n;i++)
{
scanf("%d",&type);
if(type!=3)
scanf("%d",&value);
if(type==1)
_insert(H,_size,value,++_rank,pr);
else
if(type==2)
{
int r = pr[value];
if(r!=0)
cut(H,_size,r,pr);
}
else
printf("%d\n",minim(H));
}
fclose(stdin);
fclose(stdout);
return 0;
}