Submission #120228

#TimeUsernameProblemLanguageResultExecution timeMemory
120228oolimryExamination (JOI19_examination)C++14
43 / 100
3038 ms148888 KiB
#include <bits/stdc++.h>

using namespace std;
typedef pair<int,int> ii;
struct query{
    int x, y, z, id;
};
bool comp(query a, query b){
    return a.z > b.z;
}
bool comp2(ii a, ii b){
    return a.first + a.second > b.first + b.second;
}

class SegmentTree{
public:

    int n;
    unordered_map<int,int> tree;

    void create(int nn){
        n = nn;
    }

    void update(int i){
        i += n;
        while(i > 0){
            tree[i]++;
            i >>= 1;
        }
    }

    int query(int l, int r){
        int ans = 0;
        for(l += n,r += n;l < r;l >>= 1, r >>= 1){
            if(l & 1){
                ans += tree[l];
                l++;
            }
            if(r & 1){
                r--;
                ans += tree[r];
            }
        }
        return ans;
    }
};

int main()
{
    //freopen("i.txt","r",stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    ii arr[n];
    for(int i = 0;i < n;i++){
        cin >> arr[i].first >> arr[i].second;
    }

    query queries[m];
    for(int i = 0;i < m;i++){
        int x, y, z;
        cin >> x >> y >> z;
        z = max(z, x + y);
        query q;
        q.z = z;
        q.y = y;
        q.x = x;
        q.id = i;
        queries[i] = q;
    }

    sort(queries,queries+m,comp);
    sort(arr,arr+n,comp2);
    SegmentTree x;
    SegmentTree y;
    x.create(1000000005);
    y.create(1000000005);
    int ans[m];
    int c = 0;
    for(int i = 0;i < m;i++){
        //cout << queries[i].z << ": ";
        while(true){
            if(c == n) break;
            if(arr[c].first + arr[c].second < queries[i].z) break;
            //cout << arr[c].first << " " << arr[c].second << "|";
            x.update(arr[c].first);
            y.update(arr[c].second);
            c++;
        }
        ans[queries[i].id] = c - x.query(0,queries[i].x) - y.query(0,queries[i].y);
        //cout << "\n";
    }
    for(int i = 0;i < m;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...