Submission #1188069

#TimeUsernameProblemLanguageResultExecution timeMemory
1188069user736482Railway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1910 ms243228 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000009
#define INF 1000000019
#define INFL 1000000000000000099LL
#define POT (1<<20)
ll a,b,c,d,t,n,m,l,q,k,ak;
ll sgtree[POT][2][20];
vector<pair<ll,ll>>op,op2;
multiset<ll>s;
pair<ll,ll>sg[250007][20];
ll get(ll pocz,ll kon,ll l,ll r,ll v,bool czymx,ll idx){
    if(pocz>r || kon<l)return INFL*(!czymx);
    if(pocz<=l && kon>=r){
        return sgtree[v][czymx][idx];
    }
    else{
        if(czymx)return max(
        get(pocz,kon,l,(l+r)/2,v*2,czymx,idx),
        get(pocz,kon,(l+r)/2+1,r,v*2+1,czymx,idx));
        else return min(get(pocz,kon,l,(l+r)/2,v*2,czymx,idx),
        get(pocz,kon,(l+r)/2+1,r,v*2+1,czymx,idx));
    }
}
void update(ll v,ll idx){
    sgtree[v][0][idx]=min(sgtree[v*2][0][idx],sgtree[v*2+1][0][idx]);
    sgtree[v][1][idx]=max(sgtree[v*2][1][idx],sgtree[v*2+1][1][idx]);
}
int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>k>>m;
    for(ll i=0;i<m;i++){
        cin>>a>>b;
        a--;
        b--;
        if(a<b){
            op.pb({a,b});
            op.pb({min(b+1,a+k),b+INFL});
        }
        else{
            op2.pb({a,b});
            op2.pb({max(b-1,a-k),b+INFL});
        }
    }
    sort(op.begin(),op.end());
    sort(op2.begin(),op2.end());
    reverse(op.begin(),op.end());
    for(ll i=0;i<n;i++){
        while(op.size() && op.back().ff==i){
            if(op.back().ss>=INFL){
                s.erase(s.lower_bound(op.back().ss-INFL));
            }
            else{
                s.insert(op.back().ss);
            }
            op.pop_back();
        }
       s.insert(i);
        sg[i][0].ss=(*--s.end());
        s.erase(s.lower_bound(i));
    }
    for(ll i=n-1;i>=0;i--){
        while(op2.size() && op2.back().ff==i){
            if(op2.back().ss>=INFL){
                s.erase(s.lower_bound(op2.back().ss-INFL));
            }
            else{
                s.insert(op2.back().ss);
            }
            op2.pop_back();
        }
        s.insert(i);
        sg[i][0].ff=(*s.begin());
        s.erase(s.lower_bound(i));
    }
    for(ll j=1;j<20;j++){
        for(ll i=0;i<n;i++){
            sgtree[i+POT/2][0][j-1]=sg[i][j-1].ff;
            sgtree[i+POT/2][1][j-1]=sg[i][j-1].ss;
        }
        for(ll i=POT/2-1;i>=1;i--)update(i,j-1);
        for(ll i=0;i<n;i++)sg[i][j]={get(sg[i][j-1].ff,sg[i][j-1].ss,0,POT/2-1,1,0,j-1),get(sg[i][j-1].ff,sg[i][j-1].ss,0,POT/2-1,1,1,j-1)};
    }
    cin>>q;
    for(ll i=0;i<q;i++){
        cin>>a>>b;
        a--;
        b--;
        pair<ll,ll>curr={a,a};
        ll ans=1;
        ll ak=18;
        if(sg[a][18].ss<b || sg[a][18].ff>b){
            cout<<"-1\n";
            continue;
        }
        while(1){
            while(get(curr.ff,curr.ss,0,POT/2-1,1,0,ak)<=b && get(curr.ff,curr.ss,0,POT/2-1,1,1,ak)>=b){
                ak--;
                if(ak<0)break;
            }
            if(ak<0)break;
            ans+=(1<<ak);
            curr={get(curr.ff,curr.ss,0,POT/2-1,1,0,ak),get(curr.ff,curr.ss,0,POT/2-1,1,1,ak)};
        }
        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...