Pagini recente » Cod sursa (job #2201577) | Cod sursa (job #865968) | Cod sursa (job #885500) | Cod sursa (job #2974344) | Cod sursa (job #524151)
Cod sursa(job #524151)
#include<algorithm>
using namespace std;
#define N_MAX 200005
int dimHeap;
int heap[N_MAX],poz[N_MAX];
int a[N_MAX];
int n,i,j,N;
int op,x;
void upHeap(int x)
{
while(1<x&&a[ heap[x/2] ]>a[ heap[x] ])
{
swap(poz[ heap[x/2] ],poz[ heap[x] ]);
swap(heap[x/2],heap[x]);
x=x/2;
}
}
void downHeap(int x)
{
int st=x*2;
int dr=x*2+1;
int minim=x;
if(st<=dimHeap&&a[ heap[st] ]<a[ heap[minim] ])
minim=st;
if(dr<=dimHeap&&a[ heap[dr] ]<a[ heap[minim] ])
minim=dr;
if(minim!=x)
{
swap(poz[ heap[x] ],poz[ heap[minim] ]);
swap(heap[x],heap[minim]);
downHeap(minim);
}
}
void sterge(int x)
{
swap(poz[ heap[x] ],poz[ heap[dimHeap] ]);
swap(heap[x],heap[dimHeap]);
dimHeap--;
if(a[ heap[x/2] ]>a[ heap[x] ])
upHeap(x);
else
downHeap(x);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d",&x);
a[++N]=x;
heap[++dimHeap]=N;
poz[N]=dimHeap;
upHeap(dimHeap);
}
if(op==2)
{
scanf("%d",&x);
int sterg=poz[x];
sterge(sterg);
}
if(op==3)
{
printf("%d\n",a[ heap[1] ]);
}
}
return 0;
}