제출 #1322234

#제출 시각아이디문제언어결과실행 시간메모리
1322234darlanfrancaExamination (JOI19_examination)C++20
2 / 100
3094 ms10848 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
using pii = pair<int,int>;
const int MOD = 1e9 + 7;
const int N = 2e5+10; 
const int B = 400;
const int MAX_BLOCOS = N/B + 5;
// problem link: https://oj.uz/problem/view/JOI19_examination


struct Queries{
    int x; 
    int y; 
    int z; 
    int idx;

    bool operator<(const Queries &a) const {
        return x > a.x;
    }
};

bool cmp(pii a, pii b){
    return a.first > b.first;
}

class Sqrt{
private: 
    vector<int> bloco[MAX_BLOCOS];
    vector<pii> bloco_completo[MAX_BLOCOS];
public: 
    void add(int b, int soma){
        int idx_bloco = b/B;
        bloco_completo[idx_bloco].push_back({b,soma});
        // agora eu quero inserir soma no vetor do bloco de deixar ordenado
        auto &vetor = bloco[idx_bloco];
        auto it = upper_bound(vetor.begin(), vetor.end(), soma); // encontro o primeiro cara maior que soma;
        vetor.insert(it, soma);
    }

    int query(int y_idx, int z){
        int total = 0;
        int idx_bloco = y_idx / B;

        for(auto &p : bloco_completo[idx_bloco]){
            if(p.first >= y_idx && p.second >= z) total++;
        }

        for(int i = idx_bloco + 1; i < MAX_BLOCOS; i++){
            auto &vetor = bloco[i];
            if(vetor.empty()) continue; 
            total += (vetor.end() - lower_bound(vetor.begin(), vetor.end(), z));
        }

        return total;
    }

};

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n,q; cin >> n >> q; 
    vector<pii> pares(n); 
    vector<int> coord;
    for(int i=0;i<n;i++){
        cin >> pares[i].first >> pares[i].second;
        coord.push_back(pares[i].second);
    }
    vector<Queries> queries(q);
    for(int i=0;i<q;i++){
        cin >> queries[i].x >> queries[i].y >> queries[i].z;
        queries[i].idx = i;
        coord.push_back(queries[i].y);
    }
    sort(coord.begin(), coord.end());
    coord.erase(unique(coord.begin(), coord.end()), coord.end());
    auto get_idx = [&](int val) {
        return lower_bound(coord.begin(), coord.end(), val) - coord.begin();
    };
    sort(pares.begin(), pares.end(), cmp);
    sort(queries.begin(), queries.end());

    Sqrt sq; 
    vector<int> ans(q);
    int ptr = 0;
    for(int i=0;i<q;i++){
        while(ptr < n && pares[ptr].first >= queries[i].x){
            int b_comp = get_idx(pares[ptr].second);
            sq.add(b_comp, pares[ptr].first + pares[ptr].second);
            ptr++;
        }
        int y_comp = get_idx(queries[i].y);
        ans[queries[i].idx] = sq.query(y_comp, queries[i].z); 
    }

    for(int i=0;i<q;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...