제출 #1145928

#제출 시각아이디문제언어결과실행 시간메모리
1145928VMaksimoski008Trampoline (info1cup20_trampoline)C++20
100 / 100
741 ms40308 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
const int maxn = 2e5 + 5;

int up[maxn][20];

int lb(vector<pii> &V, pii x) {
    return lower_bound(V.begin(), V.end(), x) - V.begin();
}

int main() {
    int n, m, k; cin >> n >> m >> k;
    vector<int> x(k+2), y(k+2, m+5);
    for(int i=1; i<=k+1; i++)
        for(int j=0; j<20; j++) up[i][j] = k + 1;

    map<int, vector<pii> > mp;
    for(int i=1; i<=k; i++) {
        cin >> x[i] >> y[i];
        mp[x[i]].push_back({ y[i], i });
    }

    for(auto &[r, vec] : mp)
        sort(vec.begin(), vec.end());
    for(auto [r, vec] : mp) {
        for(auto [c, i] : vec) {
            int p = lb(mp[r+1], pii{ c, 0 });
            if(p != mp[r+1].size()) up[i][0] = mp[r+1][p].second;
        }
    }

    for(int j=1; j<20; j++)
        for(int i=1; i<=k+1; i++) up[i][j] = up[ up[i][j-1] ][j-1];

    int q; cin >> q;
    while(q--) {
        int tr, tc, br, bc; cin >> tr >> tc >> br >> bc;
        if(tr > br || tc > bc) {
            cout << "No\n";
            continue;
        }

        if(tr == br) {
            cout << "Yes\n";
            continue;
        }

        int jmp = br - tr - 1;
        int p = lb(mp[tr], pii{ tc, 0 });
        if(p == mp[tr].size()) {
            cout << "No\n";
            continue;
        }
        
        int u = mp[tr][p].second;
        for(int j=19; j>=0; j--)
            if(jmp & (1 << j)) u = up[u][j];
        cout << (y[u] <= bc ? "Yes" : "No") << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...