#P1308. 【模板】二分(二)

【模板】二分(二)

Description

给出有 n 个元素的由小到大的序列,有q次询问,对于每次询问,请你编程找出某元素第一次出现的位置。(n<=10^5,q<=10^5) 

Input Format

第一行两个整数n,q

第二行n个整数组成的有重复元素的有序序列(从小到大)

接下来q行,每行一个x,表示要查找的数


Output Format

x在序列中第一次出现的位置

如果没有找到则输出-1

5 2
1 3 3 5 8
3
4
2
-1

Hint

#include <cstdio>
#include <iostream>
using namespace std;
int arr[1000005],n,k; 
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&arr[i]);
    scanf("%d",&k);
    int left=1,right=n,mid;
    while(____(1)_____)
    {
         mid=(left+right)/2;
         if(k<=arr[mid])
         ______(2)_______;
         else
          ______(3)_______;
    }
    if(____(4)_____)
    cout<<left;
    else
    cout<<-1;
}

Source

二分