Submission #1126671

#TimeUsernameProblemLanguageResultExecution timeMemory
1126671KK_1729Examination (JOI19_examination)C++17
100 / 100
967 ms89440 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define pb push_back 
#define all(a) a.begin(), a.end()
#define endl "\n"

void printVector(vector<int> a){
    for (auto x: a) cout << x << " ";
    cout << endl;
}

struct Fenwick{
    int N;
    vector<int> tree;


    Fenwick (int n){
        this->N = n;
        tree.resize(N+1);
    }
    
    int sum(int k) {
        if (k == 0) return 0;
        int s = 0;
        while (k >= 1) {
            s += tree[k];
            k -= k&-k;
        }
        return s;
    }

    void add(int k, int x) {
        while (k <= N) {
            tree[k] += x;
            k += k&-k;
        }
    }

    int query(int l, int r){
        int ans = sum(r);
        if (l > 1) ans -= sum(l-1);
        return ans;
    }
};
void solve(){
    int n, q; cin >> n >> q;

    vector<vector<int>> scores;
    set<int> se;
    FOR(i,0,n){
        int s, t; cin >> s >> t;
        scores.pb({s+t, s, t});
        se.insert(s);
        se.insert(t);
        se.insert(s+t);
    }

    vector<vector<int>> teachers;
    FOR(i,0,q){
        int x, y, z; cin >> x >> y >> z;
        z = max(z, x+y);
        teachers.pb({z, x, y, i});
        se.insert(x);
        se.insert(y);
        se.insert(z);
    }

    int ptr = 1;
    map<int, int> cc;
    for (auto x: se){
        cc[x] = ptr;ptr++;
    }

    FOR(i,0,n) scores[i] = {cc[scores[i][0]], cc[scores[i][1]], cc[scores[i][2]]};
    FOR(i,0,q) teachers[i] = {cc[teachers[i][0]], cc[teachers[i][1]], cc[teachers[i][2]], teachers[i][3]};

    sort(all(scores));reverse(all(scores));
    sort(all(teachers));reverse(all(teachers));

    Fenwick math(ptr+1);
    Fenwick informatics(ptr+1);

    int curr = 0;
    vector<int> answer(q);
    FOR(i,0,q){
        while (curr < n && scores[curr][0] >= teachers[i][0]){
            math.add(scores[curr][1], 1);
            informatics.add(scores[curr][2], 1);
            curr++;
        }

        int ans = math.sum(teachers[i][1]-1) + informatics.sum(teachers[i][2]-1);
        answer[teachers[i][3]] = curr-ans;
    }


    FOR(i,0,q) cout << answer[i] << endl;
    // cout << endl;
}

int32_t main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    int t = 1; // cin >> t;
    while (t--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...