Pagini recente » Cod sursa (job #868020) | Cod sursa (job #1775833) | Cod sursa (job #2728625) | Cod sursa (job #1879736) | Cod sursa (job #713874)
Cod sursa(job #713874)
#include<stdio.h>
#define val 200010
int H[val],aux,i,V[val],e;
short int Z[1000000010];
const char InFile[]="heapuri.in";
const char OutFile[]="heapuri.out";
FILE*f=fopen(InFile,"r");
FILE*g=fopen(OutFile,"w");
int father(int nod){
return nod/2;
}
int left_son(int nod){
return nod*2;
}
int right_son(int nod){
return nod*2+1;
}
void sift(int N,int k){
int son;
do{
son=0;
if(!((son=left_son(k))<=N))
son=0;
if(son&&right_son(k)<=N&&H[right_son(k)]<H[left_son(k)])
son=right_son(k);
if(son&&H[k]<H[son])
son=0;
if(son){
aux=H[k];
Z[H[son]]=k;
H[k]=H[son];
Z[aux]=son;
H[son]=aux;
}
}while(son);
}
void percolate(int N,int k){
int key=H[k];
while(k>1&&(key<H[father(k)])){
H[k]=H[father(k)];
Z[H[father(k)]]=k;
k=father(k);
}
H[k]=key;
Z[H[k]]=k; ;
}
int main(){
int q, operatie, nr,N=0,k;
fscanf(f,"%d",&q);
for(i=1;i<=q;i++){
fscanf(f,"%d",&operatie);
switch(operatie){
case 1:
fscanf(f,"%d",&nr);
H[++N]=nr;
V[++e]=nr;
Z[nr]=N;
percolate(N,N);
break;
case 2:
fscanf(f,"%d",&nr);
k=Z[V[nr]];
H[k]=H[N];
N--;
if(k>1&&H[k]<H[father(k)])
percolate(N,k);
else
sift(N,k);
break;
default:
fprintf(g,"%d\n",H[1]);
break;
}
}
}