Submission #1269012

#TimeUsernameProblemLanguageResultExecution timeMemory
1269012MisterReaperExamination (JOI19_examination)C++20
0 / 100
209 ms10500 KiB
// File A.cpp created on 11.09.2025 at 23:10:22
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

struct fenwick {
    int n;
    std::vector<int> tree;
    fenwick(int n_) : n(n_), tree(n + 1) {}
    void modify(int p, int x) {
        for (p += 1; p <= n; p += p & -p) {
            tree[p] += x;
        }
    }
    int get(int p) {
        int res = 0;
        for (p += 1; p; p -= p & -p) {
            res += tree[p];
        }
        return res;
    }
    int get(int l, int r) {
        return get(r) - get(l - 1);
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, Q;
    std::cin >> N >> Q;

    std::vector<int> ans(Q);
    std::vector<std::array<int, 4>> A(N + Q);
    for (int i = 0; i < N; ++i) {
        int X, Y;
        std::cin >> X >> Y;
        A[i] = {X, Y, X + Y, -1};
    }
    for (int i = 0; i < Q; ++i) {
        int X, Y, Z;
        std::cin >> X >> Y >> Z;
        A[N + i] = {X, Y, Z, i};
    }

    std::vector<int> vals;
    for (int i = 0; i < N + Q; ++i) {
        vals.emplace_back(A[i][0]);
        vals.emplace_back(A[i][1]);
        vals.emplace_back(A[i][2]);
    }

    std::sort(vals.begin(), vals.end());
    vals.erase(std::unique(vals.begin(), vals.end()), vals.end());

    int nvals = int(vals.size());
    fenwick fen(nvals);

    for (int i = 0; i < N + Q; ++i) {
        A[i][0] = int(std::lower_bound(vals.begin(), vals.end(), A[i][0]) - vals.begin());
        A[i][1] = int(std::lower_bound(vals.begin(), vals.end(), A[i][1]) - vals.begin());
        A[i][2] = int(std::lower_bound(vals.begin(), vals.end(), A[i][2]) - vals.begin());
    }

    std::sort(A.rbegin(), A.rend());

    debug(A);

    std::vector<std::array<int, 4>> tmp(N + Q);

    auto cdq = [&](auto&& self, int l, int r) -> void {
        if (l == r) {
            return;
        }
        int mid = (l + r) >> 1;
        self(self, l, mid);
        self(self, mid + 1, r);
        int ptr0 = l, ptr1 = mid + 1, ptr2 = l;
        while (ptr0 != mid + 1 && ptr1 != r + 1) {
            if (A[ptr0][1] >= A[ptr1][1]) {
                tmp[ptr2++] = A[ptr0];
                if (A[ptr0][3] == -1) {
                    fen.modify(A[ptr0][2], +1);
                }
                ptr0++;
            } else {
                tmp[ptr2++] = A[ptr1];
                if (A[ptr1][3] != -1) {
                    ans[A[ptr1][3]] += fen.get(A[ptr1][2], nvals - 1);
                }
                ptr1++;
            }
        }
        while (ptr0 != mid + 1) {
            tmp[ptr2++] = A[ptr0];
            if (A[ptr0][3] == -1) {
                fen.modify(A[ptr0][2], +1);
            }
            ptr0++;
        }
        while (ptr1 != r + 1) {
            tmp[ptr2++] = A[ptr1];
            if (A[ptr1][3] != -1) {
                ans[A[ptr1][3]] += fen.get(A[ptr1][2], nvals - 1);
            }
            ptr1++;
        }
        for (int i = l; i <= mid; ++i) {
            if (A[i][3] == -1) {
                fen.modify(A[i][2], -1);
            }
        }
        for (int i = l; i <= r; ++i) {
            A[i] = tmp[i];
        }
        debug(l, r, ans);
    };
    cdq(cdq, 0, N + Q - 1);

    for (int i = 0; i < Q; ++i) {
        std::cout << ans[i] << '\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...