Pagini recente » Cod sursa (job #1695272) | Cod sursa (job #499499) | Cod sursa (job #2320360) | Cod sursa (job #63106) | Cod sursa (job #652637)
Cod sursa(job #652637)
#include<cstdio>
using namespace std;
long heap[200003],n,nr,aux,i,m,poz[200003],c[200003],q,m1;//poz retine pozitia fiecarui elemen pt a il elimina mai repede
long op;
void reheap(int k)
{
while( (heap[k/2]>heap[k] || heap[k/2]==-1 )&& k/2)//cat timp tatal este mai mare decat fiul interschimb fiul cu tatal
{
poz[heap[k/2]]=poz[heap[k]];
aux=heap[k/2];
heap[k/2]=heap[k];
heap[k]=aux;
k/=2;
poz[nr]=k;
}
}
void insereaza(long nr)//insereaza pe nr in heap
{ n++;
if(heap[1]==0){ heap[1]=nr; poz[nr]=1; return; }
else
{
heap[n]=nr;
poz[nr]=n;
reheap(n);
}
}
void elimina(long nr)//elimina pe nr din heap
{int k=poz[nr];//pozitia in heap a numarului
while(heap[2*k]||heap[2*k+1])
{
if(heap[2*k]<heap[2*k+1] || heap[2*k+1]==0)//verifica minimul dintre fii pt a ramane heap
{
aux=poz[heap[k]];
poz[heap[k]]=poz[heap[2*k]];
poz[heap[2*k]]=aux;
aux=heap[k];
heap[k]=heap[2*k];
heap[2*k]=aux;
k=poz[nr];
}
else
{
aux=poz[heap[k]];
poz[heap[k]]=poz[heap[2*k]];
poz[heap[2*k]]=aux;
aux=heap[k];
heap[k]=heap[2*k+1];
heap[2*k+1]=aux;
k=poz[nr];
}
}
heap[poz[nr]]=-1;
}
int main()
{
freopen("heapuri.in","r",stdin);freopen("heapuri.out","w",stdout);
scanf("%ld",&m);m1=m;
for(i=1;i<=m1;i++)
{
scanf("%ld",&op);
if(op==3)printf("%ld\n",heap[1]);//afiseaza varful heapului
else
{
scanf("%ld",&nr);
if(op==1){ insereaza(nr); c[++q]=nr; }
if(op==2) elimina(c[nr]);
}
}
return 0;}