제출 #926966

#제출 시각아이디문제언어결과실행 시간메모리
926966gubshigExamination (JOI19_examination)C++17
20 / 100
152 ms6088 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int MX = 1e5 + 1e3;

struct BIT{
    int t[MX], sz = MX;

    BIT(){
        fill(t, t + MX, 0);
    }

    void update(int i, int v){
        while(i < MX){
            t[i] += v;
            i += (i & -i);
        }
    }

    int query(int i){
        int ret = 0;
        while(i){
            ret += t[i];
            i -= (i & -i);
        }
        return ret;
    }
};

int n, q, ans[MX];
bool flag[MX];
array<int, 3> s[MX];
array<int, 4> qs[MX];

void solvex(){
    sort(s + 1, s + 1 + n, [&](array<int, 3> a, array<int, 3> b){
        return a[0] > b[0];
    });
    sort(qs + 1, qs + 1 + q, [&](array<int, 4> a, array<int, 4> b){
        return a[0] > b[0];
    });

    BIT bit;
    int ptr = 1;
    for(int i = 1; i <= q; i++){
        while(ptr <= n && s[ptr][0] >= qs[i][0]){
            bit.update(s[ptr][2], 1);
            ptr++;
        }
        if(flag[qs[i][3]]) ans[qs[i][3]] += ptr - bit.query(qs[i][2] - 1) - 1;
    }
}

void solvey(){
    sort(s + 1, s + 1 + n, [&](array<int, 3> a, array<int, 3> b){
        return a[1] > b[1];
    });
    sort(qs + 1, qs + 1 + q, [&](array<int, 4> a, array<int, 4> b){
        return a[1] > b[1];
    });

    BIT bit, bitx;
    int ptr = 1;
    for(int i = 1; i <= q; i++){
        while(ptr <= n && s[ptr][1] >= qs[i][1]){
            bit.update(s[ptr][2], 1);
            bitx.update(s[ptr][0], 1);
            ptr++;
        }
        if(flag[qs[i][3]]) ans[qs[i][3]] += ptr - bit.query(qs[i][2] - 1) - 1;
        else ans[qs[i][3]] = ptr - bitx.query(qs[i][0] - 1) - 1;
    }
}

void solvez(){
    for(int i = 1; i <= q; i++){
        if(flag[qs[i][3]]) ans[qs[i][3]] -= n - qs[i][2] + 1;
    }
}

int main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    
    cin >> n >> q;
    vector<int> a, c;
    for(int i = 1; i <= n; i++){
        cin >> s[i][0] >> s[i][1];
        a.push_back(s[i][0]);
        c.push_back(s[i][0] + s[i][1]);
    }
    
    sort(a.begin(), a.end());
    a.resize(unique(a.begin(), a.end()) - a.begin());
    sort(c.begin(), c.end());
    c.resize(unique(c.begin(), c.end()) - c.begin());
    for(int i = 1; i <= n; i++){
        s[i][2] = lower_bound(c.begin(), c.end(), s[i][0] + s[i][1]) - c.begin() + 1;
        s[i][0] = lower_bound(a.begin(), a.end(), s[i][0]) - a.begin() + 1;
    }

    for(int i = 1; i <= q; i++){
        cin >> qs[i][0] >> qs[i][1] >> qs[i][2];
        flag[i] = qs[i][0] + qs[i][1] < qs[i][2];
        qs[i][0] = lower_bound(a.begin(), a.end(), qs[i][0]) - a.begin() + 1;
        qs[i][2] = lower_bound(c.begin(), c.end(), qs[i][2]) - c.begin() + 1;
        qs[i][3] = i;
    }

    solvex();
    solvey();
    solvez();

    for(int i = 1; i <= q; i++){
        cout << ans[i] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...