Pagini recente » Cod sursa (job #2240896) | Cod sursa (job #1014695) | Cod sursa (job #2861626) | Cod sursa (job #1787601)
#include <cstdio>
using namespace std;
#define nr_max 200010
int a[nr_max],idx_h[nr_max],idx_inp[nr_max],n=0,entry=0;
void add(int x)
{
a[++n]=x;
idx_h[n]=++entry;
idx_inp[entry]=n;
int i=n,aux;//i=nodul curent
while(i/2 && a[i]<a[i/2])
{
aux=a[i];a[i]=a[i/2];a[i/2]=aux;
aux=idx_h[i];idx_h[i]=idx_h[i/2];idx_h[i/2]=aux;
aux=idx_inp[idx_h[i]];idx_inp[idx_h[i]]=idx_inp[idx_h[i/2]];idx_inp[idx_h[i/2]]=aux;
i/=2;
}
}
void del(int ind)
{
int fiu,aux;
aux=a[ind];a[ind]=a[n];a[n]=aux;
aux=idx_h[ind];idx_h[ind]=idx_h[n];idx_h[n]=aux;
aux=idx_inp[idx_h[ind]];idx_inp[idx_h[ind]]=idx_inp[idx_h[n]];idx_inp[idx_h[n]]=aux;
--n;
//verific daca tre' sa urc sau sa cobor
if(ind/2 && a[ind]<a[ind/2])
{
while(ind/2 && a[ind]<a[ind/2])
{
aux=a[ind];a[ind]=a[ind/2];a[ind/2]=aux;
aux=idx_h[ind];idx_h[ind]=idx_h[ind/2];idx_h[ind/2]=aux;
aux=idx_inp[idx_h[ind]];idx_inp[idx_h[ind]]=idx_inp[idx_h[ind/2]];
idx_inp[idx_h[ind/2]]=aux;
ind/=2;
}
return;
}
while(1)
{
fiu=2*ind;
if(fiu>n)break;
if(fiu+1<=n && a[fiu]>a[fiu+1])++fiu;
if(a[ind]<=a[fiu])break;
aux=a[ind];a[ind]=a[fiu];a[fiu]=aux;
aux=idx_h[ind];idx_h[ind]=idx_h[fiu];idx_h[fiu]=aux;
aux=idx_inp[idx_h[ind]];idx_inp[idx_h[ind]]=idx_inp[idx_h[fiu]];
idx_inp[idx_h[fiu]]=aux;
ind=fiu;
}
}
int main()
{
FILE *f=fopen("heapuri.in","r"),
*g=fopen("heapuri.out","w");
int n,i,op,x;
fscanf(f,"%d",&n);
for(i=1;i<=n;++i)
{
fscanf(f,"%d",&op);
if(op==1)
{
fscanf(f,"%d",&x);
add(x);
}
else
if(op==2)
{
fscanf(f,"%d",&x);
del(idx_inp[x]);
x=x;
}
else
fprintf(g,"%d\n",a[1]);
}
return 0;
}