Pagini recente » Cod sursa (job #2484045) | Borderou de evaluare (job #440441) | Cod sursa (job #1655897) | Cod sursa (job #372235) | Cod sursa (job #303600)
Cod sursa(job #303600)
#include<stdio.h>
FILE *f,*g;
long coresp[200000],H[200000],z,ok,ls,nr,rs,i,poz[200000],st[200000],aux,n,nod[200000],el,m,x,op;
void percolate(long pozt)
{ while(H[pozt]<H[pozt/2]&&pozt!=1)
{ if(H[pozt]<H[pozt/2]&&pozt!=1)
{ z=H[pozt]; H[pozt]=H[pozt/2]; H[pozt/2]=z;
z=poz[H[pozt]]; poz[H[pozt]]=poz[H[pozt/2]]; poz[H[pozt/2]]=z;
z=nod[coresp[pozt]]; nod[coresp[pozt]]=nod[coresp[pozt/2]]; nod[coresp[pozt/2]]=z;
z=coresp[pozt]; coresp[pozt]=coresp[pozt/2]; coresp[pozt/2]=z;
pozt/=2;
}
}
}
void sift(long pozt)
{ ok=1;
while(ok)
{ ls=2*pozt; rs=2*pozt+1; if(ls>n) ls=0; if(rs>n) rs=0;
if((H[ls]<H[pozt]&&ls)||(H[rs]<H[pozt]&&rs))
{ if((H[ls]<H[rs]&&ls)||(ls&&!rs))
{ z=H[pozt]; H[pozt]=H[pozt*2]; H[pozt*2]=H[pozt];
z=poz[H[pozt]]; poz[H[pozt]]=poz[H[pozt*2]]; poz[H[pozt*2]]=z;
z=nod[coresp[pozt]]; nod[coresp[pozt]]=nod[coresp[pozt*2]]; nod[coresp[pozt*2]]=z;
z=coresp[pozt]; coresp[pozt]=coresp[pozt*2]; coresp[pozt*2]=z;
pozt=pozt*2;
}
else if((H[rs]<H[pozt]&&rs)||(rs&&!ls))
{ z=H[pozt]; H[pozt]=H[pozt*2+1]; H[pozt*2+1]=H[pozt];
z=poz[H[pozt]]; poz[H[pozt]]=poz[H[pozt*2+1]]; poz[H[pozt*2+1]]=z;
z=nod[coresp[pozt]]; nod[coresp[pozt]]=nod[coresp[pozt*2+1]]; nod[coresp[pozt*2+1]]=z;
z=coresp[pozt]; coresp[pozt]=coresp[pozt*2+1]; coresp[pozt*2+1]=z;
pozt=pozt*2+1;
}
ok=0;
}
if(!ok) ok++; else ok=0;
}
}
void insert_heap(long x)
{ nr++; st[nr]=x; n++; nod[nr]=n; coresp[n]=nr; H[n]=x; percolate(n); }
void delete_heap(long x)
{ H[nod[x]]=H[n]; n--; nod[coresp[n+1]]=nod[x];
if(H[nod[st[x]]]<H[nod[st[x]]/2]) percolate(nod[st[x]]);
else sift(nod[st[x]]);
}
int main()
{ f=fopen("heapuri.in","r"); g=fopen("heapuri.out","w");
fscanf(f,"%ld",&m);
for(i=1;i<=m;i++)
{ fscanf(f,"%ld",&op);
if(op==1)
{ fscanf(f,"%ld",&x);
insert_heap(x);
}
else if(op==2)
{ fscanf(f,"%ld",&x);
delete_heap(x);
}
else { aux=H[1]; fprintf(g,"%ld\n",aux); }
}
fclose(g);
return 0;
}