#include<iostream>
#include<cmath>
#define INF 999999999
using namespace std;
int n,m,a[110000];
int main()
{
int i;
cin>>n;
for( i=1;i<=n;i++) cin>>a[i];
cin>>m;
for( i=1;i<=m;i++)
{
a[0]=-INF;
a[n+1]=INF;
int x;
int left=1,right=n,mid;
cin>>x;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]<=x) left=mid+1;//L必定指向大于x的部分,r必定指向小于等于x的部分,这种写法的特点是l和r在结束搜索的时候会位置产生交叉,这时候要考虑搜索数组的两头情况,可能已经到达了跃出原有数据的情况,可以考虑给两头跃出的数据赋予极值以排除疏忽性的错误。
else right=mid-1;
}
if(fabs(a[right]-x)>fabs(a[left]-x))
cout<<a[left]<<endl;
else cout<<a[right]<<endl;
}
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
int n,m,a[110000];
int main()
{
int i;
cin>>n;
for( i=1;i<=n;i++) cin>>a[i];
cin>>m;
for( i=1;i<=m;i++)
{
int x;
int left=1,right=n,mid;
cin>>x;
while(left<right-1)//指向了相差一个距离的范围内,避免指向两端以外区域造成数据错误。
{
mid=(left+right)/2;
if(a[mid]<x) left=mid;//r指向了大于等于x的部分,l指向了小于x的部分
else right=mid;
}
if(fabs(a[right]-x)>=fabs(a[left]-x))//注意这里的等于号,根据题目要求多个数满足条件,输出最小的一个
cout<<a[left]<<endl;
else cout<<a[right]<<endl;
}
return 0;
}