int gmax(register int a,register int b){return a>b?a:b;}
int gmin(register int a,register int b){return a<b?a:b;}
int binary_search(unsigned *a, int n, register unsigned x)
{
int p=n*x/a[n-1];
for(int lim=16;lim<=n;lim<<=1)
{
register int l=gmax(p-lim,0),r=gmin(p+lim,n-1);
do
{
register int mid=(l+r)>>1;
(a[mid]<x)?(l=mid+1):(r=mid);
}
while(l!=r);
if(a[l]==x)return l;
}
return -1;
}