Submission #1368591

#TimeUsernameProblemLanguageResultExecution timeMemory
1368591marcus06Examination (JOI19_examination)C++20
100 / 100
203 ms12400 KiB
/**
 * author:      marcus06
 * created:     09-05-2026 12:53:45
**/
#include <bits/stdc++.h>
using namespace std;
using lli = long long;

template <typename T>
void removeDuplicate(vector <T> &v) {
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
}

struct fenwick_tree {
    int n;
    vector <int> t;
    fenwick_tree() {}
    fenwick_tree(int _n): n(_n) {
        t.resize(n + 5);
    }
    void update(int x, int value) {
        for (; x <= n; x += x & -x) t[x] += value;
    }
    int query(int x) {
        int res = 0;
        for (; x > 0; x -= x & -x) res += t[x];
        return res;
    }
    int suffix(int x) {
        return query(n) - query(x - 1);
    }
};

/*
 * type == 0: Point
 * type == 1: Query
 */
struct Data {
    int x, y, z, id, type;
    Data() {}
    Data(int _x, int _y, int _z, int _id, int _type): x(_x), y(_y), z(_z), id(_id), type(_type) {}
};

bool byX(const Data& a, const Data& b) {
    if (a.x == b.x) return a.type < b.type;
    return a.x > b.x;
}

bool byY(const Data& a, const Data& b) {
    if (a.y == b.y) return a.type < b.type;
    return a.y > b.y;
}

vector <int> vals;
int getID(int x) {
    return lower_bound(vals.begin(), vals.end(), x) - vals.begin() + 1;
}

const int MAX = int(1e5) + 5;
fenwick_tree bit;
vector <Data> dih;
int ans[MAX];
void CDQ(int l, int r) {
    if (r - l <= 1) return;
    int mid = (l + r) >> 1;
    CDQ(l, mid); CDQ(mid, r);

    vector <Data> L, R;
    for (int i = l; i < mid; ++i) {
        if (dih[i].type == 0) L.emplace_back(dih[i]);
    }
    for (int i = mid; i < r; ++i) {
        if (dih[i].type == 1) R.emplace_back(dih[i]);
    }
    sort(L.begin(), L.end(), byY);
    sort(R.begin(), R.end(), byY);

    int p = 0;
    for (int i = 0; i < (int) R.size(); ++i) {
        while (p < (int) L.size() && L[p].y >= R[i].y) {
            bit.update(L[p].z, 1);
            p++;
        }
        ans[R[i].id] += bit.suffix(R[i].z);
    }
    for (int i = 0; i < p; ++i) bit.update(L[i].z, -1);
}

void solve() {
    int N, Q;
    cin >> N >> Q;

    for (int i = 0; i < N; ++i) {
        int x, y; cin >> x >> y;
        dih.emplace_back(Data(x, y, x + y, -1, 0));
        vals.emplace_back(x + y);
    }

    for (int i = 0; i < Q; ++i) {
        int X, Y, Z;
        cin >> X >> Y >> Z;
        dih.emplace_back(Data(X, Y, Z, i, 1));
        vals.emplace_back(Z);
    }
    sort(dih.begin(), dih.end(), byX);
    
    removeDuplicate(vals);
    for (auto& e: dih) e.z = getID(e.z);
    bit = fenwick_tree(vals.size());
    CDQ(0, dih.size());
    for (int i = 0; i < Q; ++i) cout << ans[i] << '\n';
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
#ifdef LOCAL
    auto begin = std::chrono::high_resolution_clock::now();
#endif

    int tt = 1;
    while (tt--) {
        solve();
    }

#ifdef LOCAL
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    std::cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
#endif
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...