제출 #1347697

#제출 시각아이디문제언어결과실행 시간메모리
1347697DangKhoizzzzExamination (JOI19_examination)C++20
큐에 대기중
0 ms0 KiB
#include <bits/stdc++.h>
#define int long long
#define arr3 array <int , 3>
#define pii pair <int , int>
#define fi first
#define se second

using namespace std;

const int maxn = 1e5 + 7;
const int INF = 1e18;

struct Fenwick
{
    vector <int> bit;
    int n;
    Fenwick(int sz){
        n = sz;
        bit.assign(sz+5 , 0ll);
    }
    void update(int pos , int val){
        while(pos < n){
            bit[pos] += val;
            pos += (pos & (-pos));
        }
    }
    int get(int pos){
        int res = 0;
        while(pos > 0){
            res += bit[pos];
            pos -= (pos & (-pos));
        }
        return res;
    }
    int get_range(int l , int r)  {if(l > r) return 0; return get(r) - get(l-1);}
};

vector <int> val_x , val_y , val_z;
int get_x(int val) {return lower_bound(val_x.begin() , val_x.end() , val) - val_x.begin() + 1;}
int get_y(int val) {return lower_bound(val_y.begin() , val_y.end() , val) - val_y.begin() + 1;}
int get_z(int val) {return lower_bound(val_z.begin() , val_z.end() , val) - val_z.begin() + 1;}
struct query {int x , y , z;} Query[maxn];

int n , q , ans[maxn];
pii a[maxn];
vector <int> ask1[maxn] , ask2[maxn] , add2[maxn] , add1[maxn];

void solve()
{
    cin >> n >> q;
    for(int i = 1; i <= n; i++) 
    {
        cin >> a[i].fi >> a[i].se;
        val_x.push_back(a[i].fi);
        val_y.push_back(a[i].se);
        val_z.push_back(a[i].fi + a[i].se);
    }
    sort(val_x.begin() , val_x.end());
    sort(val_y.begin() , val_y.end());
    sort(val_z.begin() , val_z.end());
    val_x.erase(unique(val_x.begin() , val_x.end()) , val_x.end());
    val_y.erase(unique(val_y.begin() , val_y.end()) , val_y.end());
    val_z.erase(unique(val_z.begin() , val_z.end()) , val_z.end());
    for(int i = 1; i <= n; i++) 
    {
        add2[get_z(a[i].fi + a[i].se)].push_back(i);
        add1[get_x(a[i].fi)].push_back(i);
    }
    Fenwick BITx(maxn) ,  BITy(maxn);
    Fenwick temp(maxn);
    for(int i = 1; i <= q; i++)
    {
        cin >> Query[i].x >> Query[i].y >> Query[i].z;
        auto [x , y , z] = Query[i];
        if(x + y >= z) ask1[get_x(x)].push_back(i);
        else ask2[get_z(z)].push_back(i);
    }
    int cur = 0;
    for(int i = maxn - 1; i >= 0; i--)
    {
        for(auto id: add2[i])
        {
            BITx.update(get_x(a[id].fi) , 1);
            BITy.update(get_y(a[id].se) , 1);
            cur++;
        }
        for(auto id: ask2[i])
        {
            auto [x , y , z] = Query[id];
            ans[id] = cur - BITx.get_range(1 , get_x(x) - 1) - BITy.get_range(1 , get_y(y) - 1);
        }
    }
    for(int i = n; i >= 1; i--)
    {
        for(auto id: add1[i]) temp.update(get_y(a[id].se) , 1);
        for(auto id: ask1[i]) ans[id] = temp.get_range(get_y(Query[id].y) , maxn);
    }
    for(int i = 1; i <= q; i++) cout << ans[i] << '\n';
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    solve();
    return 0;
}

/*

TH1: A + B >= C

đếm có bao nhiêu thằng x >= A và có y >= B; 

TH2: A + B < C 

cur - có bao nhiêu thằng có tổng x+y >= C , mà y < B
- có bao nhiêu thằng có tổng x+y >= C , mà x < A 
+ có bao nhiêu thằng có tổng x+y >= C , mà x < A và y < B (loại)

*/