제출 #1349977

#제출 시각아이디문제언어결과실행 시간메모리
1349977rmielamudExamination (JOI19_examination)C++20
100 / 100
973 ms109300 KiB
#include <bits/stdc++.h>

using namespace std;

#define short int32_t
#define int int64_t
#define long __int128_t

const int inf{numeric_limits<int>::max() / 4};

struct Point {
    int x, y, z, id{-1};
};

struct FenwickTree {
    int size{};
    vector<int> tree{};

    FenwickTree() {}

    FenwickTree(int size) : size(size) {
        tree.assign(size, 0);
    }

    void add(int pos, int val) {
        for (int i{pos}; i < size; i |= i + 1) {
            tree[i] += val;
        }
    }

    int get(int pos) {
        int res{0};

        for (int i{pos}; i >= 0; i = (i & (i + 1)) - 1) {
            res += tree[i];
        }

        return res;
    }
};

struct FenwickTree2d {
    int size_x{};
    vector<FenwickTree> tree{};
    vector<map<int, int>> cc{};
    vector<int> cc_sizes{};

    FenwickTree2d(int size_x, const vector<Point>& points) : size_x(size_x) {
        tree.resize(size_x);
        cc.resize(size_x);
        cc_sizes.assign(size_x, 0);

        for (auto& [x, y, _z, _i] : points) {
            for (int i{x}; i < size_x; i |= i + 1) {
                cc[i][y] = 0;
            }
        }

        for (int x{0}; x < size_x; x++) {
            for (auto& [_, i] : cc[x]) {
                i = cc_sizes[x]++;
            }

            tree[x] = FenwickTree(cc_sizes[x]);
        }
    }

    void add(int x, int y, int val) {
        for (int i{x}; i < size_x; i |= i + 1) {
            tree[i].add(cc[i][y], val);
        }
    }

    int get(int x, int y) {
        int res{0};

        for (int i{x}; i >= 0; i = (i & (i + 1)) - 1) {
            auto iter{cc[i].upper_bound(y)};
            int comp_y{iter == cc[i].begin() ? -1 : prev(iter)->second};
            res += tree[i].get(comp_y);
        }

        return res;
    }
};

short main() {
    #ifndef LOCAL
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
    #endif

    int n, q;
    cin >> n >> q;

    map<int, int> xcc{};
    int xcc_size{0};

    vector<Point> points(n);
    vector<Point> queries(q);

    for (int i{0}; i < n; i++) {
        int s, t;
        cin >> s >> t;

        points[i] = {-s, -t, -s - t};
    }

    for (int i{0}; i < q; i++) {
        int x, y, z;
        cin >> x >> y >> z;

        queries[i] = {-x, -y, -z, i};
    }

    for (auto [x, y, z, _] : points) {
        xcc[x] = 0;
    }

    for (auto [x, y, z, _] : queries) {
        xcc[x] = 0;
    }

    for (auto& [_, index] : xcc) {
        index = xcc_size++;
    }

    for (auto& [x, y, z, _] : points) {
        x = xcc[x];
    }

    for (auto& [x, y, z, _] : queries) {
        x = xcc[x];
    }

    sort(points.begin(), points.end(), [&](const auto& a, const auto& b) {
        return a.z < b.z;
    });

    sort(queries.begin(), queries.end(), [&](const auto& a, const auto& b) {
        return a.z < b.z;
    });

    vector<int> anss(q);
    FenwickTree2d ft2(xcc_size, points);

    for (int ni{0}, qi{0}; qi < q; qi++) {
        auto [x, y, z, id]{queries[qi]};

        for (; ni < n && points[ni].z <= z; ni++) {
            ft2.add(points[ni].x, points[ni].y, 1);
        }

        anss[id] = ft2.get(x, y);
    }

    for (int i : anss) {
        cout << 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...