Pagini recente » Cod sursa (job #294673) | Cod sursa (job #615626) | Cod sursa (job #2766848) | Cod sursa (job #3218656) | Cod sursa (job #2728339)
//Ilie Dumitru
#include<cstdio>
int N, added;
int heap[200000];
int pos[200000];
int invPos[200000];
void heapSwap(int a, int b)
{
pos[invPos[a]]=b;
pos[invPos[b]]=a;
int aux=invPos[a];
invPos[a]=invPos[b];
invPos[b]=aux;
}
void push(int x)
{
int p=N++;
while(p && heap[(p-1)>>1]>x)
{
heapSwap(p, (p-1)>>1);
heap[p]=heap[(p-1)>>1];
p=(p-1)>>1;
}
heap[p]=x;
}
void up(int &p)
{
int x=heap[p];
while(p && heap[(p-1)>>1]>x)
{
heapSwap(p, (p-1)>>1);
heap[p]=heap[(p-1)>>1];
p=(p-1)>>1;
}
heap[p]=x;
}
void down(int &p)
{
bool ok=true;
while((p<<1)+2<N && ok)
{
if(heap[(p<<1)+1]<heap[p] && heap[(p<<1)+1]<heap[(p<<1)+2])
{
heapSwap(p, (p<<1)+1);
int a=heap[p];
heap[p]=heap[(p<<1)+1];
heap[(p<<1)+1]=a;
p=(p<<1)+1;
}
else if(heap[(p<<1)+2]<heap[p])
{
heapSwap(p, (p<<1)+2);
int a=heap[p];
heap[p]=heap[(p<<1)+2];
heap[(p<<1)+2]=a;
p=(p<<1)+2;
}
else
ok=false;
}
if((p<<1)+1<N && heap[(p<<1)+1]<heap[p])
{
heapSwap(p, (p<<1)+1);
int a=heap[p];
heap[p]=heap[(p<<1)+1];
heap[(p<<1)+1]=a;
p=(p<<1)+1;
}
}
void pop(int p)
{
heap[pos[p]]=heap[--N];
pos[invPos[N]]=pos[p];
invPos[pos[p]]=invPos[N];
p=pos[p];
up(p);
down(p);
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int N, op, x, i;
scanf("%i", &N);
for(x=0;x<N;++x)
pos[x]=x;
for(i=0;i<N;++i)
{
scanf("%i", &op);
switch(op)
{
case 1:
{
scanf("%i", &x);
pos[added]=::N;
invPos[::N]=added++;
push(x);
break;
}
case 2:
{
scanf("%i", &x);
pop(x-1);
break;
}
case 3:
{
printf("%i\n", heap[0]);
break;
}
}
}
fclose(stdin);
fclose(stdout);
return 0;
}