Submission #496187

#TimeUsernameProblemLanguageResultExecution timeMemory
496187model_codeOsumnjičeni (COCI21_osumnjiceni)C++17
110 / 110
321 ms25464 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long llint;
typedef pair <int, int> pi;

const int MAXN = 200005;
const int LOG = 18;

int n, q;
int lef[MAXN], rig[MAXN];
int par[MAXN][LOG];
set <pi> st;

bool can_insert (int ind) {
    if (st.empty()) return 1;

    auto it = st.lower_bound({lef[ind], 0});
    int nxt = it -> second;
    if (lef[ind] <= lef[nxt] && lef[nxt] <= rig[ind]) return 0;

    if (it != st.begin()) {
        it--;
        int prv = it -> second;
        if (lef[prv] <= lef[ind] && lef[ind] <= rig[prv]) return 0;
    }

    return 1;
}

void precompute () {
    int lim = 0;
    for (int i = 1; i <= n; i++) {
        if (lim < i) {
            st.clear();
            lim = i;
            st.insert({lef[i], i});
        }

        while (lim + 1 <= n && can_insert(lim + 1)) {
            lim++;
            st.insert({lef[lim], lim});
        }
        par[i][0] = lim + 1;

        st.erase({lef[i], i});
    }
    par[n + 1][0] = n + 1;

    for (int i = 1; i < LOG; i++) {
        for (int j = 1; j <= n + 1; j++) {
            par[j][i] = par[par[j][i - 1]][i - 1];
        }
    }
}

int upit (int a, int b) {
    int res = 0;
    for (int i = LOG - 1; i >= 0; i--) {
        if (par[a][i] <= b) {
            a = par[a][i];
            res += 1 << i;
        }
    }
    return res + 1;
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> lef[i] >> rig[i];
    }
    precompute();
    cin >> q;
    for (int i = 1; i <= q; i++) {
        int a, b;
        cin >> a >> b;
        cout << upit(a, b) << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...