最近西西艾弗岛上出入各个场所都要持有一定时限内的核酸检测阴性证明。

具体来时,如果在 出行计划(2023寒假每日一题 16)_ci

这里我们假定等待核酸检测结果需要 出行计划(2023寒假每日一题 16)_差分_02 个单位时间,即在 出行计划(2023寒假每日一题 16)_数据结构_03

如果一个场所要求持 出行计划(2023寒假每日一题 16)_差分_04 个单位时间内核酸检测结果入内,那么凭上述的核酸检测结果,可以在第 出行计划(2023寒假每日一题 16)_数据结构_03 时刻到第 出行计划(2023寒假每日一题 16)_c++_06

出行计划(2023寒假每日一题 16)_ci_07 按时间顺序列出接下来的 出行计划(2023寒假每日一题 16)_差分_08 项出行计划,其中第 出行计划(2023寒假每日一题 16)_数据结构_09 项(出行计划(2023寒假每日一题 16)_数据结构_10)可以概括为:出行计划(2023寒假每日一题 16)_算法_11 时刻进入某场所,该场所需持有 出行计划(2023寒假每日一题 16)_c++_12 个单位时间内的核酸检测结果入内,其中 出行计划(2023寒假每日一题 16)_c++_13

为了合理安排核酸检测时间,试根据小 出行计划(2023寒假每日一题 16)_ci_07

如果在 出行计划(2023寒假每日一题 16)_c++_15 时刻做了核酸检测,有多少项出行计划的核酸检测要求可以得到满足这样的查询共有 出行计划(2023寒假每日一题 16)_ci_16 个,分别为 出行计划(2023寒假每日一题 16)_c++_17

输入格式
输入的第一行包含空格分隔的三个正整数 出行计划(2023寒假每日一题 16)_差分_08出行计划(2023寒假每日一题 16)_ci_16出行计划(2023寒假每日一题 16)_差分_02

接下来输入 出行计划(2023寒假每日一题 16)_差分_08 行,其中每行包含用空格分隔的两个正整数 出行计划(2023寒假每日一题 16)_算法_11出行计划(2023寒假每日一题 16)_c++_12 ,表示一项出行计划;出行计划按时间顺序给出,满足 出行计划(2023寒假每日一题 16)_c++_24

最后输入 出行计划(2023寒假每日一题 16)_ci_16 行,每行仅包含一个正整数 qi ,表示一个查询。出行计划(2023寒假每日一题 16)_ci_16 个查询亦按照时间顺序给出,满足 出行计划(2023寒假每日一题 16)_差分_27

输出格式
输出共 出行计划(2023寒假每日一题 16)_ci_16

数据范围
出行计划(2023寒假每日一题 16)_数据结构_29 的测试数据满足 出行计划(2023寒假每日一题 16)_ci_30
出行计划(2023寒假每日一题 16)_算法_31 的测试数据满足 出行计划(2023寒假每日一题 16)_数据结构_32
全部的测试数据满足 出行计划(2023寒假每日一题 16)_c++_33

输入样例:

6 2 10
5 24
10 24
11 24
34 24
35 24
35 48
1
2

输出样例:

3
3

样例解释
时刻 出行计划(2023寒假每日一题 16)_数据结构_34 做检测,可以满足第三、四、六项出行计划;
时刻 出行计划(2023寒假每日一题 16)_ci_35


思路:

对于某个场所只有当出行时刻满足:出行计划(2023寒假每日一题 16)_c++_36 时,这些出行时刻才会算数,这个式子可以转换为 出行计划(2023寒假每日一题 16)_数据结构_37,即可以看作对每个 出行计划(2023寒假每日一题 16)_c++_15 求有多少个 出行计划(2023寒假每日一题 16)_数据结构_09 满足这个性质,转换为对于当前 出行计划(2023寒假每日一题 16)_c++_15,求它覆盖了多少个这样的区间,用差分可以解决。

#include<iostream>

using namespace std;

const int N = 200010;

int d[N];

int main(){
    
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    
    int t, c;
    for(int i = 0; i < n; i++){
        scanf("%d%d", &t, &c);
        int l = t-c-k+1, r = t-k;
        if(r > 0) d[max(l, 0)]++, d[r+1]--;
    }
    for(int i = 1; i < N; i++) d[i] += d[i-1];
    int q;
    for(int i = 0; i < m; i++){
        scanf("%d", &q);
        printf("%d\n", d[q]);
    }
    
    return 0;
}