现在现在有一台机器,这台机器可以接收两种形式任务:(1)任务列表,任务列表里面有N个任务,对于第i个任务,机器在Ti时间开始执行,并在1个单位时间内做完。(2)临时任务,机器可以在任意时间接收一个临时任务,但任务列表里面的任务优先级要高于临时任务,也就是说当机器空闲的时候才会执行临时任务。
现在机器已经接收一个任务列表。接下来会有M个临时任务,我们想知道每个临时任务何时被执行。为了简化问题我们可以认为这M个临时任务是独立无关即任务是可以同时执行的,互不影响的。
输入
输入数据有多组,每组数据第一行包括两个整数N和M(1<=N, M<=10^5)。
接下来一行有N个不同数字T1,T2,T3.....TN(1<=T1
接下来又M行,每行一个数字Qi(1<=Qi<=10^9),表示第i个临时任务的的接收时间。
输出
对于每个临时任务,输出它被执行的时间。
样例输入
5 6
1 2 3 5 6
3
2
1
4
5
6
样例输出4
4
4
4
7
7
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 111111;
int a[maxn];
int solve(int left, int right) {//找到第一个不连续点即可,也可以暴力查找,这里采用二分法
int idx;
int start = left;
while (left <= right) {
int mid = (left + right) >> 1;//移位比除法效率高
if (a[mid] - a[start] == mid - start) {//左边一直是连续的
left = mid + 1;
idx = mid;//注意是把mid值赋给idx,而不是mid+1;
}
else {//非连续的,则只需要在左边接着找
right = mid - 1;
}
}
return a[idx] + 1;
}
int main() {
//freopen("task.in", "r", stdin);
//freopen("task.out", "w", stdout);
int n, m;
while (~scanf("%d%d", &n, &m)) {
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
}
while (m--) {
int q; scanf("%d", &q);
int idx = lower_bound(a, a + n, q) - a;//地址相加减
if (idx == n || a[idx] != q) {
printf("%d\n", q);
}
else {
printf("%d\n", solve(idx, n - 1));
}
}
}
}