Pagini recente » Cod sursa (job #439584) | Cod sursa (job #1051150) | Clasament oni_10_bv | Cod sursa (job #2603112) | Cod sursa (job #1041316)
#include <cstdio>
using namespace std;
int A[200001], H[200001], poz[200001], M, N, i, x, j, d;
inline void swap(int i, int j)
{
int x;
x=H[i],H[i]=H[j],H[j]=x;
x=poz[H[i]],poz[H[i]]=poz[H[j]],poz[H[j]]=x;
}
inline void HeapUp(int i)
{
if (i==1) return;
if (A[H[i]]<A[H[i/2]]) {swap(i, i/2);HeapUp(i/2);}
}
inline void HeapDown(int i)
{
int st,dr;
if (i*2>M) return;
st=i*2;
if (i*2+1>M) dr=st+1; else dr=i*2+1;
if (st<dr)
{
swap(i, i*2);
HeapDown(i*2);
}
else
{
swap(i, i*2+1);
HeapDown(i*2+1);
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &N);
H[0]=-1;
for (i=1; i<=N; i++)
{
scanf("%d",&j);
if (j!=3) scanf("%d", &x);
if (j==1)
{
A[++M]=x;
H[M]=M;
poz[M]=M;
HeapUp(M);
}else
if (j==2)
{
d=poz[x];
swap(poz[x], M);
M--;
if (A[H[d]]<A[H[d/2]] ) HeapUp(d); else HeapDown(d);
}else printf("%d\n", A[H[1]]);
}
return 0;
}