查找最接近的元素C语言超时

谢谢帮助,请问能不能指出错误,谢谢!!


#include<stdio.h>
#include<math.h>
int BinSearch(long num[],long x,int n)
{
    int low=0,high=n-1,mid;
    while(low<=high)
    {
        mid=low+(high-low)/2;
        if(x>num[mid])
            low=mid+1;
        else if(x<num[mid])
            high=mid-1;
        else
            return mid;
    }
    return low;
}
int main()
{
    int n,m,i;
    long a[1000010],b[10010],c[10010];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        scanf("%d",b[i]);
        c[i]=BinSearch(a,b[i],n);
    }
    for(i=0;i<m;i++)
        printf("%ld",c[i]);
    return 0;
}


#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int BinSearch(long* num, long x, int n)
{
    int low, mid;
    if (num[0] - x > 0) {
        low = num[0] - x;
    }
    else {
        low = x - num[0];
    }
    for (int i = 0; i < n; i++)
    {
        if (num[i] - x > 0) {
            if (low > (num[i] - x))
            {
                low = num[i] - x;
                mid = num[i];
            }
        }
        else
        {
            if (low > (x - num[i]))
            {
                low = x - num[i];
                mid = num[i];
            }
        }
    }
    return mid;
}
int main()
{
    int n, m, i;
    long* a = (long*)malloc(sizeof(long) * 1000010);
    long b[10010], c[10010];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &m);
    for (i = 0; i < m; i++)
    {
        scanf("%d", &b[i]);
        c[i] = BinSearch(a, b[i], n);
    }
    for (i = 0; i < m; i++)
        printf("%ld\n", c[i]);
    return 0;
}

描述:

在一个非降序列中,查找与给定值最接近的元素。
输入:
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出:
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
样例输入:

3
2 5 8
2
10
5

样例输出:

8
5