Pagini recente » Monitorul de evaluare | Cod sursa (job #1548871) | Cod sursa (job #630466) | Cod sursa (job #1548824) | Cod sursa (job #631440)
Cod sursa(job #631440)
#include<stdio.h>
#include<vector>
#include<algorithm>
#define Nmax 200005
using namespace std;
int P,Poz,x,N,i,j,M,type,nr;
vector<int> H(Nmax),poz(Nmax),a(Nmax);
void Swap(int a,int b)
{
swap(H[a],H[b]);
swap(poz[H[a]],poz[H[b]]);
}
void heap_up(int nod)
{
while ( (nod>>1) && (a[H[nod>>1]]>a[H[nod]]) )
{
Swap(nod,nod>>1);
nod>>=1;
}
}
void heap_down(int nod)
{
while (nod<<1<=N)
{
if ( ((nod<<1)+1<=N) && (a[H[(nod<<1)+1]]<a[H[nod<<1]]) ) Poz=(nod<<1)+1;
else Poz=nod<<1;
if (a[H[Poz]]>a[H[nod]]) return;
Swap(nod,Poz);
nod=Poz;
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&M);
for (i=1;i<=M;++i)
{
scanf("%d",&type);
if (type==1)
{
scanf("%d",&x);
a[++nr]=x;
H[++N]=nr;
poz[nr]=N;
heap_up(N);
}
else if (type==2)
{
scanf("%d",&x);
P=poz[x];
Swap(P,N--);
heap_up(P);
heap_down(P);
}
else if (type==3)
printf("%d\n",a[H[1]]);
}
}