Submission #541162

#TimeUsernameProblemLanguageResultExecution timeMemory
541162AlperenTOsumnjičeni (COCI21_osumnjiceni)C++17
110 / 110
272 ms33644 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5, K = 20, INF = 1e9 + 5;

int n, q, a, b, nxt[N], binlift[N][K];

pair<int, int> arr[N];

multiset<pair<int, int>> st;

int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);

    cin >> n;

    for(int i = 1; i <= n; i++) cin >> arr[i].first >> arr[i].second;

    int r = 0;

    for(int i = 1; i <= n; i++){
        while(r <= n - 1){
            auto it = st.insert(arr[r + 1]);

            if(it != st.begin() && prev(it)->second >= arr[r + 1].first){
                st.erase(st.find(arr[r + 1]));
                break;
            }
            if(next(it) != st.end() && next(it)->first <= arr[r + 1].second){
                st.erase(st.find(arr[r + 1]));
                break;
            } 

            r++;
        }

        nxt[i] = r + 1;

        st.erase(st.find(arr[i]));
    }

    for(int i = n; i >= 1; i--){
        binlift[i][0] = nxt[i];

        for(int j = 1; j < K; j++) binlift[i][j] = binlift[binlift[i][j - 1]][j - 1];
    }

    cin >> q;

    while(q--){
        cin >> a >> b;

        int ans = 0;

        for(int i = K - 1; i >= 0; i--){
            if(binlift[a][i] != 0 && binlift[a][i] <= b){
                ans += 1 << i;
                a = binlift[a][i];
            }
        }

        cout << ans + 1 << "\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...