Pagini recente » Cod sursa (job #2635052) | Borderou de evaluare (job #1569307) | Cod sursa (job #2728335) | Cod sursa (job #1956646) | Cod sursa (job #306615)
Cod sursa(job #306615)
#include<stdio.h>
FILE *f,*g;
long val[200000],poz[200000],H[200000],aux,ok,x,n,a,b,minim,nr,op,o,semn;
long min(long a,long b)
{ if(a>b) return a; return b; }
void percolate(long x)
{ while(val[H[x]]<val[H[x/2]]&&x>1)
{ if(val[H[x]]<val[H[x/2]]&&x>1)
{ aux=H[x]; H[x]=H[x/2]; H[x/2]=aux;
aux=poz[H[x]]; poz[H[x]]=poz[H[x/2]]; poz[H[x/2]]=aux;
}
x/=2;
}
}
void sift(long x)
{ ok=1;
while(2*x<=n&&ok)
{ if(2*x<=n) a=val[H[2*x]]; else a=1000000002;
if(2*x<=n+1) b=val[H[2*x+1]]; else b=1000000002;
minim=min(a,b); ok=0;
if(minim<=1000000000&&minim==a)
{ aux=H[x]; H[x]=H[x*2]; H[x*2]=aux;
aux=poz[H[x]]; poz[x]=poz[H[x*2]]; poz[H[x*2]]=aux; ok=1; x=2*x;
}
else if(minim<=1000000000&&minim==b)
{ aux=H[x]; H[x]=H[x*2+1]; H[x*2]=aux;
aux=poz[H[x]]; poz[x]=poz[H[x*2+1]]; poz[H[x*2+1]]=aux; ok=1; x=2*x+1;
}
}
}
void add_heap()
{ n++; H[n]=nr; poz[nr]=n; percolate(n); }
void delete_heap()
{ H[poz[x]]=H[n]; poz[H[n]]=poz[x]; n--;
if(val[H[poz[H[x]]]]<val[H[poz[H[x]]/2]]) percolate(poz[H[x]]); else sift(poz[x]);
}
void querry()
{ fprintf(g,"%ld\n",val[H[1]]); }
int main()
{ f=fopen("heapuri.in","r"); g=fopen("heapuri.out","w");
fscanf(f,"%ld",&op);
for(o=1;o<=op;o++)
{ fscanf(f,"%ld",&semn);
if(semn==1) { fscanf(f,"%ld",&x); nr++; val[nr]=x; add_heap(); }
else if(semn==2) { fscanf(f,"%ld",&x); delete_heap(); }
else querry();
}
fclose(g);
return 0;
}