제출 #1355934

#제출 시각아이디문제언어결과실행 시간메모리
1355934vuvietExamination (JOI19_examination)C++20
2 / 100
3093 ms42668 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;
};

const int MAXN = 100000 + 5;

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

vector<multiset<ll>> seg;
vector<int> ans;

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

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

int getCount(multiset<ll>& ms, ll z) {
    return distance(ms.lower_bound(z), ms.end());
}

int querySeg(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 getCount(seg[node], z);
    }

    int mid = (l + r) >> 1;
    return querySeg(node << 1, l, mid, ql, qr, z)
         + querySeg(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);
    query.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 >> query[i].x >> query[i].y >> query[i].z;
        query[i].id = i;
        vals.push_back(query[i].y);
    }

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

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

    int M = vals.size();
    seg.assign(4 * M + 5, multiset<ll>());

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

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

    int ptr = 0;

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

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

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

    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...