Submission #1137940

#TimeUsernameProblemLanguageResultExecution timeMemory
1137940woohyun_jngExamination (JOI19_examination)C++20
100 / 100
406 ms138840 KiB
#include <bits/stdc++.h>
#define int long long

#define MAX 200000
using namespace std;

int S[MAX], T[MAX], K[MAX];
vector<int> tree[3][MAX * 4], A[3][MAX];

void init(int t, int sz) {
    for (int i = 1; i <= sz; i++) {
        tree[t][i + sz - 1] = A[t][i];
        sort(tree[t][i + sz - 1].begin(), tree[t][i + sz - 1].end());
    }
    for (int i = sz - 1; i > 0; i--) {
        tree[t][i].resize(tree[t][i << 1].size() + tree[t][i << 1 | 1].size());
        merge(tree[t][i << 1].begin(), tree[t][i << 1].end(), tree[t][i << 1 | 1].begin(), tree[t][i << 1 | 1].end(), tree[t][i].begin());
    }
}

int query(int t, int sz, int l, int r, int k, bool upper) {
    int res = 0;
    for (l += sz - 1, r += sz; l < r; l >>= 1, r >>= 1) {
        if (l & 1) {
            if (upper)
                res += tree[t][l].end() - lower_bound(tree[t][l].begin(), tree[t][l].end(), k), l++;
            else
                res += lower_bound(tree[t][l].begin(), tree[t][l].end(), k) - tree[t][l].begin(), l++;
        }
        if (r & 1) {
            if (upper)
                --r, res += tree[t][r].end() - lower_bound(tree[t][r].begin(), tree[t][r].end(), k);
            else
                --r, res += lower_bound(tree[t][r].begin(), tree[t][r].end(), k) - tree[t][r].begin();
        }
    }
    return res;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int N, Q, X, Y, Z, res;
    bool flag;
    vector<int> Scomp, Tcomp, Kcomp;

    cin >> N >> Q;

    for (int i = 1; i <= N; i++) {
        cin >> S[i] >> T[i], K[i] = S[i] + T[i];
        Scomp.push_back(S[i]), Tcomp.push_back(T[i]), Kcomp.push_back(S[i] + T[i]);
    }

    sort(Scomp.begin(), Scomp.end()), Scomp.erase(unique(Scomp.begin(), Scomp.end()), Scomp.end());
    sort(Tcomp.begin(), Tcomp.end()), Tcomp.erase(unique(Tcomp.begin(), Tcomp.end()), Tcomp.end());
    sort(Kcomp.begin(), Kcomp.end()), Kcomp.erase(unique(Kcomp.begin(), Kcomp.end()), Kcomp.end());

    for (int i = 1; i <= N; i++) {
        S[i] = lower_bound(Scomp.begin(), Scomp.end(), S[i]) - Scomp.begin() + 1;
        T[i] = lower_bound(Tcomp.begin(), Tcomp.end(), T[i]) - Tcomp.begin() + 1;
        K[i] = lower_bound(Kcomp.begin(), Kcomp.end(), K[i]) - Kcomp.begin() + 1;

        A[0][K[i]].push_back(S[i]), A[1][K[i]].push_back(T[i]);
        A[2][S[i]].push_back(T[i]);
    }
    init(0, Kcomp.size()), init(1, Kcomp.size()), init(2, Scomp.size());

    while (Q--) {
        cin >> X >> Y >> Z, res = 0;
        flag = Z > X + Y;

        X = lower_bound(Scomp.begin(), Scomp.end(), X) - Scomp.begin() + 1;
        Y = lower_bound(Tcomp.begin(), Tcomp.end(), Y) - Tcomp.begin() + 1;
        Z = lower_bound(Kcomp.begin(), Kcomp.end(), Z) - Kcomp.begin() + 1;
    
        if (flag) {
            res = query(0, Kcomp.size(), Z, Kcomp.size(), X, true);
            res -= query(1, Kcomp.size(), Z, Kcomp.size(), Y, false);
        } else
            res = query(2, Scomp.size(), X, Scomp.size(), Y, true);

        cout << res << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...