Pagini recente » Cod sursa (job #3162595) | Cod sursa (job #2650751) | Cod sursa (job #3131170) | Cod sursa (job #749806) | Cod sursa (job #274133)
Cod sursa(job #274133)
#include<stdio.h>
#define INPUT "heapuri.in"
#define OUTPUT "heapuri.out"
#define NMAX 200001
#define INFI 2000000000
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
long Heap[ NMAX ], PHeap[ NMAX ], PEnter[ NMAX ];
long Poz;
inline void twist(long &_A, long &_B)
{
_A = _A + _B;
_B = _A - _B;
_A = _A - _B;
}
void AddHeap(long _X)
{
++Poz;
long PCur = Poz;
Heap[ Poz ] = _X; ///Heapul sortat
PHeap[ Poz ] = Poz; ///Pozitia in heap a celui de-al i-lea element
PEnter[ Poz ] = Poz; ///Pozitia de intrare a elementului de pe pozitia i din heap
while( PCur / 2 > 0 && Heap[ PCur / 2 ] > Heap[ PCur ])
{
twist(Heap[ PCur / 2 ], Heap[ PCur ]);
twist(PEnter[ PCur / 2 ], PEnter[ PCur ]);
twist(PHeap[ PEnter[ PCur / 2] ], PHeap[ PEnter[ PCur ] ]);
PCur /= 2;
}
}
void ExtractHeap(long _X)
{
Heap[ PHeap[ _X ] ] = INFI;
long PCur = PHeap[ _X ];
PHeap[ _X ] = -1;
while(PCur * 2 <= Poz)
{
if(PCur * 2 + 1 <= Poz && Heap[ PCur * 2 + 1 ] < Heap[ PCur * 2 ])
{
twist(Heap[ PCur ], Heap[ PCur * 2 + 1]);
twist(PEnter[ PCur ], PEnter[ PCur * 2 + 1]);
twist(PHeap[ PEnter[ PCur ] ], PHeap[ PEnter[ PCur * 2 + 1 ] ]);
PCur = PCur * 2 + 1;
}
else
{
twist(Heap[ PCur ], Heap[ PCur * 2 ]);
twist(PEnter[ PCur ], PEnter[ PCur * 2 ]);
twist(PHeap[ PEnter[ PCur ] ], PHeap[ PEnter[ PCur *2 ] ] );
PCur = PCur * 2;
}
}
--Poz;
}
int main()
{
long N, X;
int Code;
Poz = 0;
fscanf(fin, "%ld", &N);
for(long i = 0; i < N; ++i)
{
fscanf(fin, "%d", &Code);
if(Code == 1)
{
fscanf(fin, "%ld", &X);
AddHeap(X);
}
else
if(Code == 2)
{
fscanf(fin, "%ld", &X);
ExtractHeap(X);
}
else
fprintf(fout, "%ld\n", Heap[ 1 ]);
}
fclose(fin);
fclose(fout);
return 0;
}