每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
3 3 1 100 10 1000 1000000000 1001 9 10 1000000000
100 1000 1001
import java.util.*;
public class Main
{
private static int binnarySearch(int[][] arr, int lim)
{
int left = 0;
int right = arr.length - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid][0] <= lim)
left = mid + 1;
else
right = mid - 1;
}
return right;
}
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[][] jobs = new int[n][2];
for (int i = 0; i < n; i++)
{
jobs[i][0] = scanner.nextInt();
jobs[i][1] = scanner.nextInt();
}
int[] abilities = new int[m];
for (int i = 0; i < m; i++)
abilities[i] = scanner.nextInt();
Arrays.sort(jobs, (a, b) -> a[0] - b[0]);
int[] preMax = new int[n];
preMax[0] = jobs[0][1];
for (int i = 1; i < n; i++)
preMax[i] = Math.max(preMax[i - 1], jobs[i][1]);
for (int i = 0; i < m; i++)
{
int index = binnarySearch(jobs, abilities[i]);
if (index < 0)
System.out.println(0);
else if (index >= n)
System.out.println(preMax[n - 1]);
else
System.out.println(preMax[index]);
}
}
}