제출 #529489

#제출 시각아이디문제언어결과실행 시간메모리
529489wiwihoRailway Trip 2 (JOI22_ho_t4)C++14
0 / 100
479 ms27388 KiB
#include <bits/stdc++.h>

#define iter(a) a.begin(), a.end()
#define mp make_pair
#define F first
#define S second
#define eb emplace_back
#define lsort(a) sort(iter(a))
#define gsort(a) sort(iter(a), greater<>())

using namespace std;

typedef long long ll;
typedef double ld;

using pii = pair<int, int>;

ll iceil(ll a, ll b){
    return (a + b - 1) / b;
}

#define lc (2 * id + 1)
#define rc (2 * id + 2)

int n;

struct Node{
    pii mx = mp(-1, -1), tag = mp(-1, -1);
};

vector<Node> st;

void addtag(int id, pii v){
    st[id].tag = max(st[id].tag, v);
    st[id].mx = max(st[id].mx, v);
}

void push(int id){
    addtag(lc, st[id].tag);
    addtag(rc, st[id].tag);
    st[id].tag = mp(-1, -1);
}

void pull(int id){
    st[id].mx = max(st[lc].mx, st[rc].mx);
}

void modify(int l, int r, pii v, int L = 1, int R = n, int id = 0){
    if(l <= L && R <= r){
        addtag(id, v);
        return;
    }
    push(id);
    int M = (L + R) / 2;
    if(r <= M) modify(l, r, v, L, M, lc);
    else if(l > M) modify(l, r, v, M + 1, R, rc);
    else{
        modify(l, r, v, L, M, lc);
        modify(l, r, v, M + 1, R, rc);
    }
    pull(id);
}

pii query(int l, int r, int L = 1, int R = n, int id = 0){
    if(l <= L && R <= r) return st[id].mx;
    push(id);
    int M = (L + R) / 2;
    if(r <= M) return query(l, r, L, M, lc);
    else if(l > M) return query(l, r, M + 1, R, rc);
    else return max(query(l, r, L, M, lc), query(l, r, M + 1, R, rc));
}

vector<vector<int>> anc;
vector<int> lb, rb;
int ts = 0;

const int SZ = 20;

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

    int K, m;
    cin >> n >> K >> m;
    rb.resize(m + 1);
    anc.resize(SZ, vector<int>(m + 1));
    lb.resize(m + 1);
    rb.resize(m + 1);
    st.resize(4 * n);

    for(int i = 1; i <= m; i++) anc[0][i] = i;

    for(int i = 1; i <= m; i++){
        int l, r;
        cin >> l >> r;
        lb[i] = l; rb[i] = r;
        modify(l, min(r - 1, l + K - 1), mp(r, i));
    }

    vector<int> best(n + 1);
    for(int i = 1; i <= n; i++){
        best[i] = query(i, i).S;
    }

    for(int i = 1; i <= m; i++){
        int pr = query(lb[i], rb[i]).S;
        if(pr == -1) continue;
        //cerr << "pr " << i << " " << pr << "\n";
        anc[0][i] = pr;
    }

    for(int i = 1; i < SZ; i++){
        for(int j = 1; j <= m; j++){
            anc[i][j] = anc[i - 1][anc[i - 1][j]];
        }
    }

    int q;
    cin >> q;
    
    while(q--){

        int s, t;
        cin >> s >> t;
        
        int now = best[s];
        if(now == -1){
            cout << "-1\n";
            continue;
        }

        if(rb[now] >= t){
            cout << "1\n";
            continue;
        }

        int ans = 1;
        for(int i = SZ - 1; i >= 0; i--){
            if(rb[anc[i][now]] < t){
                now = anc[i][now];
                ans += 1 << i;
            }
        }
        now = anc[0][now];
        ans++;
        if(rb[now] < t){
            cout << "-1\n";
            continue;
        }
        cout << ans << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...