Pagini recente » Cod sursa (job #237069) | Cod sursa (job #654008) | Cod sursa (job #173384) | Cod sursa (job #2634168) | Cod sursa (job #274375)
Cod sursa(job #274375)
#include<cstdio>
#include<algorithm>
using namespace std;
#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 ], Enter[ NMAX ], PHeap[ NMAX ];
long Nr, Poz;
inline void twist(long &_A, long &_B)
{
_A = _A + _B;
_B = _A - _B;
_A = _A - _B;
}
void AddHeap(long _X)
{
++Poz, ++Nr;
Heap[ Poz ] = _X;
Enter[ Poz ] = Nr;
PHeap[ Nr ] = Poz;
long p = Poz;
while( p / 2 > 0 && Heap[ p/2 ] > Heap[ p ])
{
swap(Heap[ p/2 ], Heap[ p ]);
swap(Enter[ p/2 ], Enter[ p ]);
swap(PHeap[ Enter[ p/2 ] ], PHeap[ Enter[ p ] ]);
p /= 2;
}
for(long i = 1; i <= Poz; ++i)
fprintf(stderr, "%ld ", Heap[ i ]);
fprintf(stderr, "\n");
}
void ExtractHeap(long _X)
{
long pEx = PHeap[ _X ];
Heap[ pEx ] = Heap[ Poz ];
Heap[ Poz ] = INFI;
Enter[ pEx ] = Enter[ Poz ];
Enter[ Poz ] = -1;
PHeap[ Enter[ pEx ] ] = pEx;
PHeap[ _X ] = -1;
--Poz;
long p = pEx;
while( p * 2 <= Poz )
{
if( p * 2 + 1 <= Poz)
{
if(Heap[ p*2 ] < Heap[ p*2 + 1 ] && Heap[ p ] > Heap[ p*2 ])
{
swap(Heap[ p*2 ], Heap[ p ]);
swap(Enter[ p*2 ], Enter[ p ]);
swap(PHeap[ Enter[ p*2 ] ], PHeap[ Enter[ p ] ]);
p *= 2;
}
else
if(Heap[ p*2 ] > Heap[ p*2 + 1 ] && Heap[ p ] > Heap[ p*2 + 1 ])
{
swap(Heap[ p*2 +1 ], Heap[ p ]);
swap(Enter[ p*2 +1 ], Enter[ p ]);
swap(PHeap[ Enter[ p*2 +1 ] ], PHeap[ Enter[ p ] ]);
p = p*2 + 1;
}
else break;
}
else
{
if(Heap[ p ] > Heap[ p * 2 ])
{
swap(Heap[ p*2 ], Heap[ p ]);
swap(Enter[ p*2 ], Enter[ p ]);
swap(PHeap[ Enter[ p*2 ] ], PHeap[ Enter[ p ] ]);
p *= 2;
}
else break;
}
}
}
int main()
{
long N, X;
int Code;
Nr = 0;
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;
}