Submission #1241795

#TimeUsernameProblemLanguageResultExecution timeMemory
1241795damoonRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
415 ms484644 KiB
#include <bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("O3,unroll-loops") //main
//#pragma GCC target("avx2") //cf...
//#pragma GCC target("sse4") //Quera

#define ll long long
typedef pair<int,int> pii;
typedef pair<int,pii> pip;
typedef pair<pii,int> ppi;
typedef pair<pii,pii> ppp;
#define f first
#define s second

#define lc 2*id
#define rc 2*id+1
#define all(x) x.begin(),x.end()

#define pb push_back
#define pp pop_back
#define unicorn(x) x.resize(unique(x.begin(),x.end())-x.begin())

string pr(int* vv,int l,int r){for(int i=l;i<r;i++)cout<<vv[i]<<" ";return "";}
string pr( ll* vv,int l,int r){for(int i=l;i<r;i++)cout<<vv[i]<<" ";return "";}
string pr(vector<int> vv){for(auto i:vv)cout<<i<<" ";return "";}
string pr( vector<ll> vv){for(auto i:vv)cout<<i<<" ";return "";}
string pr(pii* vv,int l,int r){for(int i=l;i<r;i++)cout<<"( "<<vv[i].f<<","<<vv[i].s<<" )    ";return "";}
string pr(vector<pii> vv){for(auto i:vv)cout<<"( "<<i.f<<","<<i.s<<" )    ";return "";}

const int L = 1e5+10,lg = 18;
const int inf = 1e9+10;
int n,m,k,q;
int hb[L];
int mx[lg][L],mn[lg][L];

struct stmx{
    int st[lg][L],fn[lg][L];
    stmx(){
        fill(st[0]+1,st[0]+L,0);
        fill(fn[0]+1,fn[0]+L,0);
    }

    void put(int ind,int x){
        st[0][ind] = fn[0][ind] = max(st[0][ind],x);
    }

    void build(){
        for(int j=1;j<lg;j++){
            for(int i=1;i<=n;i++){
                if(i+(1<<j)-1 <= n)
                    st[j][i] = max(st[j-1][i], st[j-1][i+(1<<(j-1))]);
                if(i-(1<<j)+1 >= 1)
                    fn[j][i] = max(fn[j-1][i], fn[j-1][i-(1<<(j-1))]);
            }
        }
    }

    int get(int l,int r){
        if(l > r)
            return 0;
        return max(st[hb[r-l+1]][l],fn[hb[r-l+1]][r]);
    }
};
struct stmn{
    int st[lg][L],fn[lg][L];
    stmn(){
        fill(st[0]+1,st[0]+L,L);
        fill(fn[0]+1,fn[0]+L,L);
    }

    void put(int ind,int x){
        st[0][ind] = fn[0][ind] = min(st[0][ind],x);
    }

    void build(){
        for(int j=1;j<lg;j++){
            for(int i=1;i<=n;i++){
                if(i+(1<<j)-1 <= n)
                    st[j][i] = min(st[j-1][i], st[j-1][i+(1<<(j-1))]);
                if(i-(1<<j)+1 >= 1)
                    fn[j][i] = min(fn[j-1][i], fn[j-1][i-(1<<(j-1))]);
            }
        }
    }

    int get(int l,int r){
        if(l > r)
            return L;
        return min(st[hb[r-l+1]][l],fn[hb[r-l+1]][r]);
    }
};

stmx frf,sx[lg];
stmn frb,sn[lg];

int main(){
    //ofstream cout ("out.out");
    //ifstream cin ("in.in");

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    hb[0] = -1;
    for(int i=1;i<L;i++){
        hb[i] = hb[i/2]+1;
    }

    cin>>n>>k>>m;
    for(int i=1;i<=m;i++){
        int l,r;
        cin>>l>>r;
        frf.put(l,r);
        frb.put(l,r);
    }


    frf.build();
    frb.build();
    for(int i=1;i<=n;i++){
        mx[0][i] = max(i,frf.get(max(1,i-k+1),i));
        mn[0][i] = min(i,frb.get(i,min(i+k-1,n)));
        sx[0].put(i,mx[0][i]);
        sn[0].put(i,mn[0][i]);
    }


    sx[0].build();
    sn[0].build();
    for(int x=1;x<lg;x++){
        for(int i=1;i<=n;i++){
            mx[x][i] = sx[x-1].get(mn[x-1][i],mx[x-1][i]);
            mn[x][i] = sn[x-1].get(mn[x-1][i],mx[x-1][i]);
            sx[x].put(i,mx[x][i]);
            sn[x].put(i,mn[x][i]);
        }
        sx[x].build();
        sn[x].build();
    }

    /*
    for(int i=1;i<=n;i++){
        for(int j=0;j<2;j++){
            cout<<"mx["<<j<<"]["<<i<<"]: "<<mn[j][i]<<" "<<mx[j][i]<<endl;
        }
    }
    */

    cin>>q;
    for(int tt=0;tt<q;tt++){
        int S,F;
        cin>>S>>F;
        if(F < mn[lg-1][S] or F > mx[lg-1][S]){
            cout<<-1<<endl;
            continue;
        }
        int l=S, r=S;
        int ans = 0;
        for(int i=lg-1;i>=0;i--){
            pii pre = pii(l,r);
            l = sn[i].get(pre.f,pre.s);
            r = sx[i].get(pre.f,pre.s);
            if(F >= l and F <= r){
                l = pre.f;
                r = pre.s;
            }
            else{
                ans += (1<<i);
            }
        }
        cout<<ans+1<<endl;
    }
}
#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...