题目描述
给定一个包含N个各不相同的正整数序列A,接下来进行M次查询,每次查询给定一个正整数X,请查询X是否属于序列A,如果X属于序列A,输出X是序列A中第几小的数。如果不存在,输出0。
输入格式
第1行:两个空格分隔的正整数N和M,分别表示序列A中元素的数量和查询的次数。
第2行:N个空格分隔的正整数,表示序列A中的N个正整数。
第3行:M个空格分隔的正整数,表示M次查询的正整数X。
输出格式
共M行:每次查询对应一行,如果查询的正整数X属于序列A输出X是序列A中第几小的数。如果不存在,输出0。
输入输出样例
输入样例1:
5 3 1 3 5 7 9 3 6 9
输出样例1:
2 0 5
说明
【数据范围】
1 <= N, M <= 100000,1 <= X <= 10^9,1 <= 序列A中的元素 <= 10^9,
【耗时限制】1000ms 【内存限制】128MB
//
//Created by Carlgood.
//
//Note:This program is written in version DEV-C++ 5.11.
//Subject source:"hppt://oj.codingle.cn"
# include <iostream>
# include<cmath>
# include<string>
# include<cstring>
# include<cstdio>
# include<algorithm>
# include<sstream>
# include<vector>
# define This_program_is_written_by_Carlgood_Programming_Studio 9876543210
using namespace std;
const int N=1e5+10;
int a[N];
int middle(int l,int r,int x)
{
while(l<r)
{
int m=(l+r)/2;
if(a[m]==x)
{
return m;
}
else if(a[m]>x)
{
r=m;
}
else
{
l=m+1;
}
}
return -1;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
int p=middle(1,n+1,x);
if(p!=-1)
{
cout<<p<<endl;
}
else
{
cout<<"0"<<endl;
}
}
return 0;
}