Pagini recente » Cod sursa (job #703714) | Cod sursa (job #2044391) | Cod sursa (job #2056440) | Cod sursa (job #694529) | Cod sursa (job #917044)
Cod sursa(job #917044)
#include <stdio.h>
#define MAX_N 200000
using namespace std;
int N,SW,ACN,U;
int Heap[MAX_N],Pos[MAX_N],PosHeap[MAX_N];
void Swap(int a,int b)
{
int aux=Heap[a];
Heap[a]=Heap[b];
Heap[b]=aux;
aux=PosHeap[a];
PosHeap[a]=PosHeap[b];
PosHeap[b]=aux;
aux=Pos[PosHeap[a]];
Pos[PosHeap[a]]=Pos[PosHeap[b]];
Pos[PosHeap[b]]=aux;
}
void Up(int nod){
int father=nod/2;
U=nod;
if(nod<=1||Heap[father]<Heap[nod])
return;
SW=1;
Swap(father,nod);
Up(father);
}
int ReturnMinSon(int father)
{
int left=2*father;
int right=2*father+1;
if(right>ACN)
return left;
if(Heap[left]<Heap[right])
return left;
return right;
}
void Down(int nod){
U=nod;
if(2*nod>ACN)
return;
int son=ReturnMinSon(nod);
if(Heap[son]<Heap[nod])
{
SW=1;
Swap(son,nod);
Down(son);
}
}
void Add(int nod,int nr){
ACN++;
Heap[nod]=nr;
Pos[nod]=nod;
PosHeap[nod]=nod;
Up(nod);
}
void Delete(int nr)
{
int nod=Pos[nr];
// printf("intrat:%d\n",nr);
Heap[nod]=Heap[ACN];
PosHeap[nod]=PosHeap[ACN];
Pos[PosHeap[nod]]=nod;
SW=0;
ACN--;
Up(nod);
if(SW==0)
{
Down(nod);
}
}
void Read()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d\n",&N);
int i,sw,nr;
for(i=1;i<=N;i++){
scanf("%d ",&sw);
if(sw==1)
{
scanf("%d\n",&nr);
Add(ACN+1,nr);
}
else if(sw==2)
{
scanf("%d\n",&nr);
Delete(nr);
}
else
printf("%d\n",Heap[1]);
}
fclose(stdin);
fclose(stdout);
}
int main()
{
Read();
return 0;
}