#include <bits/stdc++.h>
using namespace std;

vector<int> R,C;

// index が条件を満たすかどうか
bool isOKR(int index, int key) {
    if (R[index] >= key) return true;
    else return false;
}

// 汎用的な二分探索のテンプレ
int binary_searchR(int key) {
    int ng = -1; //「index = 0」が条件を満たすこともあるので、初期値は -1
    int ok = (int)R.size(); // 「index = a.size()-1」が条件を満たさないこともあるので、初期値は a.size()
    
    /* ok と ng のどちらが大きいかわからないことを考慮 */
    while (abs(ok - ng) > 1) {
        int mid = (ok + ng) / 2;

        if (isOKR(mid, key)) ok = mid;
        else ng = mid;
    }
    return ok;
}

// index が条件を満たすかどうか
bool isOKC(int index, int key) {
    if (C[index] >= key) return true;
    else return false;
}

// 汎用的な二分探索のテンプレ
int binary_searchC(int key) {
    int ng = -1; //「index = 0」が条件を満たすこともあるので、初期値は -1
    int ok = (int)C.size(); // 「index = a.size()-1」が条件を満たさないこともあるので、初期値は a.size()
    
    /* ok と ng のどちらが大きいかわからないことを考慮 */
    while (abs(ok - ng) > 1) {
        int mid = (ok + ng) / 2;

        if (isOKC(mid, key)) ok = mid;
        else ng = mid;
    }
    return ok;
}

int main() {
    int H,W,N,Q,a,b,c;
    cin>>H>>W>>N>>Q;
    for(int i=0;i<N;i++){
        cin>>a>>b;
        R.push_back(a);
        C.push_back(b);
    }
    sort(R.begin(),R.end());
    sort(C.begin(),C.end());
    for(int i=0;i<Q;i++){
        cin>>a>>b>>c;
        if(a==1){
            cout<<binary_searchR(c+1)-binary_searchR(b)<<endl;
        }else{
            cout<<binary_searchC(c+1)-binary_searchC(b)<<endl;
        }
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: