2297. Day11 A - 魔法通行禁止令

众所周知,魔法队的大家都是用传送门赶路的。

但是传送门偶尔也可能成为路上的阻碍。

在一条笔直的长为 n 米的道路上,有 m 个关闭的传送门。

CReatiQ 可以选择是否打开每扇传送门。

当有人走到传送门处时,他会被传送到道路的北端,之后这扇传送门将被关闭。

现在 Lacrymabre 以 1 米每秒的速度从道路的最北端走到道路的最南端吃饭。

CReatiQ 打算捉弄一下他!

CReatiQ 将会给出 q 次询问,每次询问至少打开多少扇传送门,才能使得 Lacrymabre 通过道路的所需时间大于 t_i

因为重复运行对传送门会产生损耗,所以 CReatiQ 不会重复打开某扇传送门。

语法教学

简单的二分 需要 反复手写 写出 腱鞘炎?(主播又在咬打火机了)

介绍:lower_bound

lower_bound(begin,end,x);

lower_bound 可以在一个单调递增的数组中进行二分查找,它返回指向第一个 大于等于 x 的元素的位置的迭代器。若不存在,则返回尾迭代器。

若该数组不是单调递增的,可以先使用一次 sort 使得数组递增。

对一个 int 类型 1-index 一维数组的使用例:

int a[10001],x; //... sort(a+1,a+n+1); // 如果原本不递增,就需要进行 sort 使其获得可以 lower_bound 的性质。 int *it=lower_bound(a+1,a+n+1,x); // 返回第一个大于等于 x 的元素的位置的迭代器

如果需要的是第一个大于等于 x 的元素的位置下标:

int index=lower_bound(a+1,a+n+1,x)-a-1; // 后面减的是 begin

如果需要的是第一个大于等于 x 的元素的值:

int value=*lower_bound(a+1,a+n+1,x); // !!!注意,当检索对象不一定存在时,可能需要先 check 一下返回的是否是 end,防止越界

可以类似得到:

0-index 下的写法:

int *it=lower_bound(a,a+n,x); int index=lower_bound(a,a+n,x)-a; int value=*lower_bound(a,a+n,x); //value=*it; //value=a[index];

0-index vector 下的写法:

sort(a.begin(),a.end()); vector<int>::iterator it=lower_bound(a.begin(),a.end(),x); int index=lower_bound(a.begin(),a.end(),x)-a.begin(); int value=*lower_bound(a.begin(),a.end(),x); // 同理,注意 check lower_bound()=a.end() 的情况。

upper_bound 返回指向第一个 大于 x 的元素的位置的迭代器。若不存在,则返回尾迭代器。用法和 lower_bound 一样,可以多多自行尝试探索一下 qwq 。

输入

第一行三个正整数 n,m,q (1 \leq n \leq 10^9,1 \leq m \leq 2 \times 10^5,1 \leq q \leq 2 \times 10^5),分别表示道路的长度、传送门的数量与询问的数量。

第二行 m 个非负整数 d_i (0 \leq d_i \leq n),表示每个传送门到道路北端的距离。

随后 q 行每行一个非负整数 t_i (0 \leq t_i \leq 10^{18}),表示询问的所需时间。

输出

输出共 q 行,每行一个整数代表询问的答案,若无解则输出 -1

样例

标准输入 复制文本
10 7 6
1 9 1 9 8 1 0
10
16
36
37
13
36
标准输出 复制文本
1
1
4
5
1
4

提示

虽然有 lower_bound 的教学,但由于本题没有强制在线,不一定要使用二分通过。

登录以提交代码。
单点时限 1 秒
内存限制 128 MB
提交 22
通过 6