제출 #207680

#제출 시각아이디문제언어결과실행 시간메모리
207680nvmdavaExamination (JOI19_examination)C++17
2 / 100
2023 ms482076 KiB
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ll long long
#define ff first
#define ss second
#define N 100000
#define MOD 1000000007
#define INF 0x3f3f3f3f

vector<pair<int, pair<int, int> > > ar;
vector<pair<pair<int, int>, pair<int, int> > > qu;
map<int, int> scmp, tcmp;

struct Y {
    int val = 0;
    Y *l = NULL, *r = NULL;

    int query(int L, int R, int y){
        if(R <= y)
            return val;
        if(L > y)
            return 0;
        int m = (L + R) >> 1;
        int w = 0;
        if(l)
            w += l -> query(L, m, y);
        if(r && m < y)
            w += r -> query(m + 1, R, y);
        return w;
    }
    void update(int L, int R, int y){
        ++val;
        if(L == R)
            return;
        int m = (L + R) >> 1;
        if(m >= y){
            if(!l)
                l = new Y();
            l -> update(L, m, y);
        } else {
            if(!r)
                r = new Y();
            r -> update(m + 1, R, y);
        }
    }
};

struct X {
    Y *val = new Y();
    X *l = NULL, *r = NULL;

    int query(int L, int R, int x, int y){
        if(R <= x)
            return val -> query(1, N, y);
        if(L > x)
            return 0;
        int m = (L + R) >> 1;
        int w = 0;
        if(l)
            w += l -> query(L, m, x, y);
        if(r && m < x)
            w += r -> query(m + 1, R, x, y);
        return w;
    }
    void update(int L, int R, int x, int y){
        val -> update(1, N, y);
        if(L == R) return;
        int m = (L + R) >> 1;
        if(m >= x){
            if(!l)
                l = new X();
            l -> update(L, m, x, y);
        } else {
            if(!r)
                r = new X();
            r -> update(m + 1, R, x, y);
        }
    }
} *seg = new X();

int ans[N];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, q;
    cin>>n>>q;
    int mxs = 0, mxt = 0;
    for(int i = 1; i <= n; ++i){
        int s, t;
        cin>>s>>t;
        mxs = max(mxs, s);
        mxt = max(mxt, t);
        ar.push_back({s + t, {s, t}});
        scmp[s] = 0;
        tcmp[t] = 0;
    }
    int w;

    w = 0;
    for(auto& x : scmp)
        x.ss = ++w;
    w = 0;
    for(auto& x : tcmp)
        x.ss = ++w;
    int ss = scmp.size(), ts = tcmp.size();
    for(auto& x : ar){
        x.ss.ff = ss + 1 - scmp[x.ss.ff];
        x.ss.ss = ts + 1 - tcmp[x.ss.ss];
    }

    sort(ar.rbegin(), ar.rend());

    for(int i = 1; i <= q; ++i){
        int a, b, c;
        cin>>a>>b>>c;
        if(a > mxs || b > mxt)
            continue;
        a = scmp.lower_bound(a) -> ss;
        b = tcmp.lower_bound(b) -> ss;
        a = ss + 1 - a;
        b = ts + 1 - b;
        qu.push_back({{c, i}, {a, b}});
    }
    sort(qu.rbegin(), qu.rend());

    w = 0;

    for(auto& x : qu){
        while(w != n && ar[w].ff >= x.ff.ff){
            seg -> update(1, N, ar[w].ss.ff, ar[w].ss.ss);
            ++w;
        }
        ans[x.ff.ss] = seg -> query(1, N, x.ss.ff, x.ss.ss);
    }
    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...