Pagini recente » Cod sursa (job #1030295) | Cod sursa (job #1400717) | Cod sursa (job #1285531) | Cod sursa (job #3175153) | Cod sursa (job #723133)
Cod sursa(job #723133)
#include <fstream>
using namespace std;
long M[200005];
long INX[200005];
long TIME[200005];
long HS;
void swap(long &a,long &b)
{
long c = a;
a = b;
b = c;
}
void heapinsert(long T,long P)
{
long s = HS;
M[s] = T;
INX[P] = s;
TIME[s] = P;
while ((s != 1) && (M[s / 2] > M[s]))
{
swap(M[s/2],M[s]);
swap(INX[TIME[s/2]],INX[TIME[s]]);
swap(TIME[INX[s/2]],TIME[INX[s]]);
s = s / 2;
}
HS += 1;
}
void heapdelete(long s)
{
M[s] = M[HS - 1];
if (((s * 2) < HS) && (M[s * 2] < M[s * 2 + 1]))
{
M[s] = M[s * 2];
swap(INX[TIME[s * 2]],INX[TIME[s]]);
swap(TIME[INX[s * 2]],TIME[INX[s]]);
heapdelete(s * 2);
return;
}
if (((s * 2 + 1) < HS) && (M[s * 2] > M[s * 2 + 1]))
{
M[s] = M[s * 2 + 1];
swap(INX[TIME[s * 2 + 1]],INX[TIME[s]]);
swap(TIME[INX[s * 2 + 1]],TIME[INX[s]]);
heapdelete(s * 2 + 1);
return;
}
}
int main(void)
{
long N,O,T,i,P;
fstream fin("heapuri.in",ios::in);
fstream fout("heapuri.out",ios::out);
fin >> N;
HS = 1;
P = 1;
for (i = 0;i < N;i += 1)
{
fin >> O;
if (O == 1)
{
fin >> T;
heapinsert(T,P);
P += 1;
}
if (O == 2)
{
fin >> T;
heapdelete(INX[T]);
HS -= 1;
}
if (O == 3)
{
fout << M[1] << "\n";
}
}
fin.close();
fout.close();
return 0;
}