Pagini recente » Cod sursa (job #747249) | Cod sursa (job #3276997) | Cod sursa (job #239456) | Cod sursa (job #726583) | Cod sursa (job #634398)
Cod sursa(job #634398)
#include <cstdio>
using namespace std;
const int MAX_N = 200005;
int a[MAX_N],heap[MAX_N],p[MAX_N];
int n,lungimeHeap,lungimeA;
void coboaraInHeap(int pozInHeap)
{
int fiu;
do
{
fiu = 0;
if(pozInHeap<<1 <= lungimeHeap)
{
fiu = pozInHeap<<1;
if(fiu+1 <= lungimeHeap && a[heap[fiu]] > a[heap[fiu+1]])
fiu++;
}
if(a[heap[pozInHeap]] <= a[heap[fiu]])
fiu = 0;
if(fiu)
{
int aux=heap[pozInHeap];
heap[pozInHeap]=heap[fiu];
heap[fiu] = aux;
p[heap[pozInHeap]] = pozInHeap;
p[heap[fiu]] = fiu;
pozInHeap = fiu;
}
}while(fiu);
}
void urcaInHeap(int pozInHeap)
{
int pozInA = heap[pozInHeap];
while(pozInHeap>1 && a[pozInA] < a[heap[pozInHeap>>1]])
{
heap[pozInHeap] = heap[pozInHeap>>1];
p[heap[pozInHeap]] = pozInHeap;
pozInHeap>>=1;
}
heap[pozInHeap] = pozInA;
p[heap[pozInHeap]] = pozInHeap;
}
void inserare(int pozInA)
{
lungimeHeap++;
heap[lungimeHeap] = pozInA;
p[heap[lungimeHeap]] = lungimeHeap;
urcaInHeap(lungimeHeap);
}
void stergere(int pozInHeap)
{
heap[pozInHeap] = heap[lungimeHeap];
p[heap[pozInHeap]] = pozInHeap;
lungimeHeap--;
if(pozInHeap>1 && a[heap[pozInHeap]] < a[heap[pozInHeap>>1]])
urcaInHeap(pozInHeap);
else
coboaraInHeap(pozInHeap);
}
int main()
{
FILE* fp;
fp = freopen("heapuri.in","rt",stdin);
fp = freopen("heapuri.out","wt",stdout);
int abc,instructiune,x;
lungimeA=0;
abc = scanf("%d",&n);
for(int i=1;i<=n;i++)
{
abc = scanf("%d",&instructiune);
if(instructiune == 1)
{
abc = scanf("%d",&x);
a[++lungimeA]=x;
inserare(lungimeA);
}
else if(instructiune == 2)
{
abc = scanf("%d",&x);
stergere(p[x]);
}
else
{
printf("%d\n",a[heap[1]]);
}
}
return 0;
}