Submission #1268552

#TimeUsernameProblemLanguageResultExecution timeMemory
1268552lambd47Railway Trip 2 (JOI22_ho_t4)C++20
35 / 100
876 ms122636 KiB
#include <bits/stdc++.h>

#define int long long
using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int MOD=1e9+7;
const int MX=1e5+7;

struct seg{
    vector<int> mx,mn;
    int n;
    seg(){
        n=MX;
        mx=vector<int>(4*n,0);
        mn=vector<int>(4*n,MOD);
    }
    void update(int pos,int ini, int fim, int id, int val){
        if(ini>id || fim<id)return;
        if(ini==fim){
            mx[pos]=max(mx[pos],val);
            mn[pos]=min(mn[pos],val);
            return;
        }
        int m=(ini+fim)/2;
        update(2*pos,ini,m,id,val);
        update(2*pos+1,m+1,fim,id,val);
        mn[pos]=min(mn[2*pos],mn[2*pos+1]);
        mx[pos]=max(mx[2*pos],mx[2*pos+1]);
    }
    pair<int,int> query(int pos, int ini,int fim, int l, int r){
        if(ini>r || fim<l)return{MOD,0};
        if(l<=ini && fim<=r){
            return {mn[pos],mx[pos]};
        }
        int m=(ini+fim)/2;
        auto a=query(2*pos,ini,m,l,r);
        auto b=query(2*pos+1,m+1,fim,l,r);
        return {min(a.first,b.first),max(a.second,b.second)};
    }
};
const int lg=17;

void solve() {
    int n,m;cin>>n>>m;
    vector<seg> segs(lg);
    vector<vector<int>> vai(n);
    vector<vector<int>> volta(n);
    int k;cin>>k;
    L(i,0,n-1){
        segs[0].update(1,0,n-1,i,i);
    }
    L(i,0,k-1){
        int a,b;cin>>a>>b;
        a--;b--;
        if(a<b){
            vai[a].push_back(b);
            int x=min(a+m,b+1);
            if(x!=n)vai[x].push_back(n+b);
        }
        else{
            volta[a].push_back(b);
            int x=min(a-m,b-1);
            if(x>=0)volta[x].push_back(n+b);
        }
    }
    multiset<int> at;
    L(i,0,n-1){
        for(auto a:vai[i]){
            if(a>=n){
                at.erase(at.find(a-n));
            }
            else{
                at.insert(a);
            }
        }
        auto pt=at.end();
        if(!at.empty()){
            pt--;
            segs[0].update(1,0,n-1,i,*pt);
        }
    }
    at.clear();
    R(i,n-1,0){
        for(auto a:volta[i]){
            if(a>=n){
                at.erase(at.find(a-n));
            }
            else{
                at.insert(a);
            }
            if(!at.empty()){
                auto pt=at.begin();
                segs[0].update(1,0,n-1,i,*pt);
            }
        }
    }
    L(i,1,lg-1){
        L(j,0,n-1){
            auto b=segs[i-1].query(1,0,n-1,j,j);
            auto a=segs[i-1].query(1,0,n-1,b.first,b.second);
            segs[i].update(1,0,n-1,j,a.first);
            segs[i].update(1,0,n-1,j,a.second);
        }
    }
    int q;cin>>q;
    while(q--){
        int a,b;cin>>a>>b;
        a--;b--;
        int l=a;int r=a;
        if(a==b){
            cout<<0<<"\n";continue;
        }
        int resp=0;
        R(i,lg-1,0){
            auto p=segs[i].query(1,0,n-1,l,r);
            if(p.first<= b && b<= p.second){
                //deu certo ent resp<somando 
                continue;
            }
            else{
                l=p.first;
                r=p.second;
                resp+=(1<<i);
            }
        }
        if(resp>n){
            cout<<-1<<"\n";continue;
        }
        cout<<resp+1<<"\n";
    }







}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(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...