제출 #1355936

#제출 시각아이디문제언어결과실행 시간메모리
1355936vuvietExamination (JOI19_examination)C++20
0 / 100
192 ms36084 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

struct Student {
    ll s, t, sum;
};

struct Query {
    ll x, y, z;
    int id;
};

int N, Q;
vector<Student> stu;
vector<Query> qr;
vector<ll> vals;
vector<int> ans;

vector<vector<ll>> seg;

void build(int node, int l, int r) {
    if (l == r) return;
    int mid = (l + r) >> 1;
    build(node << 1, l, mid);
    build(node << 1 | 1, mid + 1, r);
}

void add(int node, int l, int r, int pos, ll val) {
    seg[node].push_back(val);
    if (l == r) return;

    int mid = (l + r) >> 1;
    if (pos <= mid) add(node << 1, l, mid, pos, val);
    else add(node << 1 | 1, mid + 1, r, pos, val);
}

int getCnt(const vector<ll>& v, ll z) {
    return (int)(v.end() - lower_bound(v.begin(), v.end(), z));
}

int query(int node, int l, int r, int ql, int qr, ll z) {
    if (qr < l || r < ql) return 0;

    if (ql <= l && r <= qr)
        return getCnt(seg[node], z);

    int mid = (l + r) >> 1;
    return query(node << 1, l, mid, ql, qr, z)
         + query(node << 1 | 1, mid + 1, r, ql, qr, z);
}

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

    // freopen("examination.in", "r", stdin);
    // freopen("examination.out", "w", stdout);

    cin >> N >> Q;

    stu.resize(N);
    qr.resize(Q);
    ans.assign(Q, 0);

    for (int i = 0; i < N; i++) {
        cin >> stu[i].s >> stu[i].t;
        stu[i].sum = stu[i].s + stu[i].t;
        vals.push_back(stu[i].t);
    }

    for (int i = 0; i < Q; i++) {
        cin >> qr[i].x >> qr[i].y >> qr[i].z;
        qr[i].id = i;
        vals.push_back(qr[i].y);
    }

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

    auto getPos = [&](ll x) {
        return (int)(lower_bound(vals.begin(), vals.end(), x) - vals.begin()) + 1;
    };

    int M = vals.size();

    seg.assign(4 * M + 5, vector<ll>());

    sort(stu.begin(), stu.end(), [](Student a, Student b) {
        return a.s > b.s;
    });

    sort(qr.begin(), qr.end(), [](Query a, Query b) {
        return a.x > b.x;
    });

    int ptr = 0;

    for (auto q : qr) {
        while (ptr < N && stu[ptr].s >= q.x) {
            add(1, 1, M, getPos(stu[ptr].t), stu[ptr].sum);
            ptr++;
        }

        int L = lower_bound(vals.begin(), vals.end(), q.y) - vals.begin() + 1;

        if (L <= M)
            ans[q.id] = query(1, 1, M, L, M, q.z);
        else
            ans[q.id] = 0;
    }

    for (int i = 1; i <= 4 * M; i++)
        sort(seg[i].begin(), seg[i].end());

    // phải query lại sau khi sort
    ptr = 0;
    fill(ans.begin(), ans.end(), 0);

    for (auto q : qr) {
        while (ptr < N && stu[ptr].s >= q.x) ptr++;

        int L = lower_bound(vals.begin(), vals.end(), q.y) - vals.begin() + 1;

        if (L <= M)
            ans[q.id] = query(1, 1, M, L, M, q.z);
    }

    for (int i = 0; i < Q; i++)
        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...