Submission #534869

#TimeUsernameProblemLanguageResultExecution timeMemory
534869PixelCatRailway Trip 2 (JOI22_ho_t4)C++14
100 / 100
1255 ms325252 KiB
/*       code by the cute PixelCat owo       */
/*   as cute as nacho neko (aka. my wife)!   */
// #pragma GCC
// optimize("O4,unroll-loops,no-stack-protector")
#include <bits/stdc++.h>
#define int LL  //__int128
#define double long double
using namespace std;
using LL = long long;
using uLL = unsigned long long;
using pii = pair<int, int>;

#define For(i, a, b) for (int i = a; i <= b; i++)
#define Fors(i, a, b, s) for (int i = a; i <= b; i += s)
#define Forr(i, a, b) for (int i = a; i >= b; i--)
#define F first
#define S second
#define L(id) (id * 2 + 1)
#define R(id) (id * 2 + 2)
#define LO(x) (x & (-x))

#define eb emplace_back
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define mkp make_pair

// #define MOD (int)(998244353)
#define MOD (int)((LL)1e9 + 7)
#define INF (int)(9000000000000000000ll)  // 9e18
#define EPS (1e-6)

#ifdef NYAOWO
#include "library/debug.hpp"
inline void USACO(const string &s) {
    cerr << "USACO: " << s << "\n";
}

#else
#define debug(...)
inline void timer() {}
inline void USACO(const string &s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}

#endif

inline void NYA() {
    ios::sync_with_stdio(false);
    cin.tie(0);
}
inline int gcd(int a, int b) {
    return __gcd(a, b);
}
inline int lcm(int a, int b) {
    return a / gcd(a, b) * b;
}
int fpow(int b, int p, const int &mod) {
    int ans = 1;
    while (p) {
        if (p & 1) ans = ans * b % mod;
        p /= 2;
        b = b * b % mod;
    }
    return ans;
}
int fpow(int b, int p) {
    return fpow(b, p, MOD);
}
template <typename T>
inline void chmin(T &_a, const T &_b) {
    if (_b < _a) _a = _b;
}
template <typename T>
inline void chmax(T &_a, const T &_b) {
    if (_b > _a) _a = _b;
}
// mt19937_64 rng(
//     chrono::steady_clock::now().time_since_epoch().count());

int n;

struct Sparse{
    int32_t a[100010][20];
    void set(int i,int x){
        a[i][0]=x;
    }
    void build(bool f){
        For(j,0,18) For(i,1,n){
            int i2=i+(1<<j);
            if(i2>n) a[i][j+1]=a[i][j];
            else if(f) a[i][j+1]=max(a[i][j],a[i2][j]);
            else a[i][j+1]=min(a[i][j],a[i2][j]);
        }
    }
    int rmxq(int l,int r){
        int k=__lg(r-l+1);
        return max(a[l][k],a[r-(1<<k)+1][k]);
    }
    int rmnq(int l,int r){
        int k=__lg(r-l+1);
        return min(a[l][k],a[r-(1<<k)+1][k]);
    }
}lsp[20],rsp[20];

// take n trains from s
bool step(int s,int t,int ns){
    int l=s;
    int r=s;
    For(j,0,19) if(ns&(1<<j)){
        int tl=lsp[j].rmnq(l,r);
        int tr=rsp[j].rmxq(l,r);
        if(tl>l) debug(s,t,ns);
        l=tl; r=tr;
    }
    return l<=t && t<=r;
}

int32_t main() {
    NYA();
    // nyaacho >/////<
    // miku sama bless me >/////<
    cin>>n;
    int k; cin>>k;
    int m; cin>>m;
    {
        vector<pii> vr,vl;
        For(i,1,m){
            int l,r; cin>>l>>r;
            if(l<r) vr.eb(l,r);
            else vl.eb(r,l);
        }

        m=sz(vr);
        sort(all(vr));
        multiset<int> st;
        int itl=0,itr=-1;
        For(r,1,n){
            while(itr<m-1 && vr[itr+1].F==r){
                itr++;
                st.insert(vr[itr].S);
            }
            while(itl<=m-1 && vr[itl].F<=r-k){
                st.erase(st.find(vr[itl].S));
                itl++;
            }
            int res=r;
            if(sz(st)) res=max(res,*st.rbegin());
            rsp[0].set(r,res);
        }

        m=sz(vl);
        sort(all(vl),[](const pii &a,const pii &b){
            return a.S<b.S;
        });
        st.clear();
        itl=m-1;
        itr=m;
        Forr(l,n,1){
            while(itr>0 && vl[itr-1].S==l){
                itr--;
                st.insert(vl[itr].F);
            }
            while(itl>=0 && vl[itl].S>=l+k){
                st.erase(st.find(vl[itl].F));
                itl--;
            }
            int res=l;
            if(sz(st)) res=min(res,*st.begin());
            lsp[0].set(l,res);
        }
    }
    lsp[0].build(false);
    rsp[0].build(true);
    For(j,1,19){
        For(i,1,n){
            int l=lsp[j-1].a[i][0];
            int r=rsp[j-1].a[i][0];
            lsp[j].set(i,lsp[j-1].rmnq(l,r));
            rsp[j].set(i,rsp[j-1].rmxq(l,r));
        }
        lsp[j].build(false);
        rsp[j].build(true);
    }
    int q; cin>>q;
    while(q--){
        int s,t; cin>>s>>t;
        int lo=-1,hi=(1<<20)-1;
        while(hi-lo>1){
            int mi=(hi+lo)/2;
            if(step(s,t,mi)) hi=mi;
            else lo=mi;
        }
        if(hi+1==(1<<20)){
            cout<<"-1\n";
        }else{
            cout<<hi<<"\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...