Pagini recente » Cod sursa (job #2325985) | Cod sursa (job #2459114) | Borderou de evaluare (job #1569435) | Cod sursa (job #2807541) | Cod sursa (job #1240269)
#include <stdio.h>
#define nmax 200001
using namespace std;
long heap[nmax],v[nmax],poz[nmax],n,k;
void swaps(int p1, int p2)
{
long aux;
poz[heap[p1]]=p2;
poz[heap[p2]]=p1;
aux=heap[p1];
heap[p1]=heap[p2];
heap[p2]=aux;
}
void urca(int p)
{
while(p/2>0&&v[heap[p/2]]>v[heap[p]])
{
swaps(p,p/2);
p=p/2;
}
}
void coboara(int p)
{
int ok,poz; long mini;
do{
ok=0;mini=932123321;
if(p*2<=n&&v[heap[p*2]]<mini)
{
poz=p*2; mini=v[heap[poz]];
}
if(p*2+1<=n&&v[heap[p*2+1]]<mini)
{
poz=p*2+1; mini=v[heap[poz]];
}
if(mini!=932123321&&mini<v[heap[p]])
{
ok=1;
swaps(p,poz);
p=poz;
}
}while(ok);
}
int main()
{
FILE *f=fopen("heapuri.in","r"),*g=fopen("heapuri.out","w");
unsigned long i,j,x;
int cod;
fscanf(f,"%ld",&j);
for(i=1;i<=j;i++)
{
fscanf(f,"%d",&cod);
if(cod==3)
fprintf(g,"%d\n",v[heap[1]]);
else {
fscanf(f,"%ld",&x);
if(cod==1)
{
++k;
heap[++n]=k;
poz[k]=n;
v[k]=x;
urca(poz[k]);
}
else {
heap[poz[x]]=heap[n];
poz[heap[n]]=poz[x];
--n;
if(poz[x]<n)
coboara(poz[x]);
}
}
}
fclose(f); fclose(g);
return 0;
}