题目描述
对于一个长度为n的有序序列有以下两种操作:
1.对于给定的值x,找到大于等于x的值,如果有多个等于x的值那么就找到最后一个值为x的序列下标,否则就找到第一个大于x的序列下标
2.对于给定的值x,找到小于等于x的值,如果有多个等于x的值那么就找到最后一个值为x的序列下标,否则就找到第一个小于x的序列下标
如果找不到就输出"NO", 序列下标从1开始,序列保证有序。
输入
第一行包含两个正整数n(n <= 100000) 和 m(m <= 100000),分别表示序列大小和询问的次数。第二行是n个由空格隔开的有序序列a(其中0 <= ai <= 200000), 接下来m行每行一个整数x(0 <= x <= 200000)表示要查找的数。
输出
输出包含m行,m行包含两个整数x y, 分别代表第一个和第二个操作的答案,或者找不到就输出"NO"。
样例输入 Copy
5 5
1 3 3 3 5
1
2
3
5
6
样例输出 Copy
1 1
2 1
4 4
5 5
NO 5
import java.io.*;
import java.nio.Buffer;
import java.util.*;
public class Main {
static BufferedReader bf=new BufferedReader(new InputStreamReader((System.in)));
static StreamTokenizer st=new StreamTokenizer(bf);
static PrintWriter pw=new PrintWriter(System.out);
static int I() throws IOException{
st.nextToken();
return (int) st.nval;
}
public static void main(String[] args) throws IOException {
int n=I();
int m=I();
int[] arr=new int[n];
for (int i = 0; i <n ; i++) {
arr[i]=I();
}
while (m-->0){
int p=I();
int o=0;
int l=0,r=n-1;
while(l<r){
int mid=(l+r)/2;
if(arr[mid]>=p)r=mid;
else{l=mid+1;}
}
if(l==n-1&&arr[l]<p){
System.out.println("NO "+(l+1));
continue;
}else if(p!=arr[l]){
l++;
System.out.print(l);
if((l-1)==0){
System.out.println(" NO");
}else {
System.out.println(" "+(l-1));
}
continue;
}else if (p==arr[l]) {
while(l<=arr.length-1&&arr[l]==p){
l++;
}
System.out.println(l+" "+l);
}
}
}
}