Pagini recente » Cod sursa (job #619365) | Cod sursa (job #2310315) | Cod sursa (job #805362) | Cod sursa (job #1192426) | Cod sursa (job #344155)
Cod sursa(job #344155)
#include <stdio.h>
#define N 1<<18
int n,tip,nr;
int heap[N],r;
int pozitii[N],t,val;
void interschimba(int poz1, int poz2)
{
int temp = heap[poz1];
heap[poz1] = heap[poz2];
heap[poz2] = temp;
}
void mut_in_sus(int poz)
{
if (poz > 1 && heap[poz/2] > heap[poz])
{
interschimba(poz, poz/2);
mut_in_sus(poz/2);
}
}
void mut_in_jos(int poz)
{
if ((2*poz <= r && heap[poz] > heap[2*poz] ) ||
(2*poz+1<= r && heap[poz] > heap[2*poz+1]))
{
int minimum = 2*poz;
if (2*poz+1 <= r && heap[2*poz+1] < heap[2*poz])
minimum = 2*poz+1;
interschimba(poz, minimum);
mut_in_jos(minimum);
}
}
int gasesc_minim()
{
return heap[1];
}
void caut(int nod)
{
if (heap[nod]==val)
{
nr=nod;
return;
}
if (heap[nod]<val)
{
if (nod*2<=r)
caut(2*nod);
if (nod*2+1<=r)
caut(nod*2+1);
}
return;
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
int i;
for (i=1; i<=n; i++)
{
scanf("%d",&tip);
if (tip!=3)
scanf("%d",&nr);
if (tip==1)
{
pozitii[++t]=nr;
heap[++r]=nr;
mut_in_sus(r);
}
if (tip==2)
{
val=pozitii[nr];
caut(1);
heap[nr]=heap[r];
r--;
mut_in_jos(nr);
}
if (tip==3)
printf("%d\n",gasesc_minim());
}
return 0;
}