제출 #1242003

#제출 시각아이디문제언어결과실행 시간메모리
1242003GeforgsRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
800 ms162108 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <unordered_map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
#define ll long long
#define ld long double
#define inf (ll)(2*1e18)
#define sort(a) sort(a.begin(), a.end())
#define reverse(a) reverse(a.begin(), a.end())
#define pb push_back
#define endl "\n"
using namespace std;

const ll dim=22;

void build(ll id, ll l, ll r, vector<pair<ll, ll>>& a, vector<pair<ll, ll>>& b){
    if(l == r){
        b[id] = a[l];
        return;
    }
    ll m=(l+r)/2;
    build(2*id, l, m, a, b);
    build(2*id+1, m+1, r, a, b);
    b[id].first = min(b[2*id].first, b[2*id+1].first);
    b[id].second = max(b[2*id].second, b[2*id+1].second);
}

pair<ll, ll> get(ll id, ll l, ll r, ll tl, ll tr, vector<pair<ll, ll>>& b){
    if(r < tl or tr < l) return {inf, -inf};
    if(tl <= l and r <= tr){
        return b[id];
    }
    ll m=(l+r)/2;
    pair<ll, ll> res1, res2;
    res1 = get(2*id, l, m, tl, tr, b);
    res2 = get(2*id+1, m+1, r, tl, tr, b);
    return {min(res1.first, res2.first), max(res1.second, res2.second)};
}

ll find(ll x, ll y, ll n, vector<vector<pair<ll, ll>>>& b){
    pair<ll, ll> res=get(1, 0, n-1, x, x, b[dim-1]);
    ll ans=0, l=x, r=x;
    if(y < res.first or res.second < y) return -1;
    for(int i=dim-1;i>=0;--i){
        res = get(1, 0, n-1, l, r, b[i]);
        if(y < res.first or res.second < y){
            ans += (1<<i);
            l = res.first;
            r = res.second;
        }
    }
    return ans+1;
}

void solve(){
    ll n, k, m, q, i, j, x, y;
    cin>>n>>k>>m;
    vector<vector<ll>> addA(n);
    vector<vector<ll>> delA(n);
    vector<vector<ll>> addB(n);
    vector<vector<ll>> delB(n);
    vector<pair<ll, ll>> a(n);
    multiset<ll> s;
    vector<vector<pair<ll, ll>>> b(dim, vector<pair<ll, ll>>(4*n));
    for(i=0;i<m;++i){
        cin>>x>>y;
        --x;
        --y;
        if(x < y){
            addA[x].pb(y);
            delA[min(x + k - 1, y - 1)].pb(y);
        }else{
            addB[x].pb(y);
            delB[max(x - k + 1, y + 1)].pb(y);
        }
    }
    for(i=0;i<n;++i){
        a[i] = {i, i};
        for(auto el: addA[i]){
            s.insert(el);
        }
        if(!s.empty()){
            a[i].second = max(*s.rbegin(), a[i].second);
        }
        for(auto el: delA[i]){
            s.erase(s.find(el));
        }
    }
    for(i=n-1;i>=0;--i){
        for(auto el: addB[i]){
            s.insert(el);
        }
        if(!s.empty()){
            a[i].first = min(*s.begin(), a[i].first);
        }
        for(auto el: delB[i]){
            s.erase(s.find(el));
        }
    }
    for(i=0;i<dim;++i){
        build(1, 0, n-1, a, b[i]);
        for(j=0;j<n;++j){
            a[j] = get(1, 0, n-1, a[j].first, a[j].second, b[i]);
        }
    }
    cin>>q;
    for(i=0;i<q;++i){
        cin>>x>>y;
        --x;
        --y;
        cout<<find(x, y, n,b)<<endl;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    srand(time(nullptr));
    ll t=1;
//    cin>>t;
    for(;t>0;--t){
        solve();
    }
    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...