Submission #1244612

#TimeUsernameProblemLanguageResultExecution timeMemory
1244612nasjesRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1175 ms131772 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
#include "unordered_set"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;

const ll dim = 4e5+7;
//const ll mod = 1e9 + 7;
const ll inf = 1e18 + 177;
#define endl "\n"
#define fi first
#define pb push_back
#define se second
#define vll vector<ll>

ll n,  m, x, y, k, q;

pll t[24][4*dim];
vector<pll> ev[dim];
pll road[dim];
ll gol[dim], gor[dim];
pll ask(ll v, ll tl, ll tr, ll l, ll r, ll id){
    if(tl>r || tr<l)return{inf, -inf};
    if(l<=tl && tr<=r)return t[id][v];
    ll tm=(tl+tr)/2;
    pll cur1= ask(2*v, tl, tm, l, r, id);
    pll cur2= ask(2*v+1, tm+1, tr, l, r, id);
    return {min(cur1.fi, cur2.fi), max(cur1.se, cur2.se)};


}
void build(ll v, ll tl, ll tr, ll id){
    if(tl==tr){
        if(id==0){
            t[id][v]={gol[tl], gor[tl]};
            //cout<<tl<<" "<<tr<<"     "<<t[id][v].fi<<" "<<t[id][v].se<<endl;
        }
        else{
            pll nw=ask(1, 1, n, tl, tl, id-1);
            nw=ask(1, 1, n, nw.fi, nw.se, id-1);
            t[id][v]=nw;
        }
        return;
    }
    ll tm=(tl+tr)/2;
    build(2*v, tl, tm, id);
    build(2*v+1, tm+1, tr, id);
    t[id][v]={min(t[id][2*v].fi, t[id][2*v+1].fi), max(t[id][2*v].se, t[id][2*v+1].se)};
    if(id==0){
       // cout<<tl<<" "<<tr<<"     "<<t[id][v].fi<<" "<<t[id][v].se<<endl;
    }
}
ll qu(ll u, ll v){
    pll mx=ask(1, 1, n, u, u, 22);
    //cout<<mx.fi<<" "<<mx.se<<endl;
    if(!(mx.fi<=v && v<=mx.se))return -1;
    ll jumpl=u;
    ll jumpr=u;
    ll res=0;
    for(int i=21; i>=0; i--){
        pll cur=ask(1,1, n, jumpl, jumpr, i);
     //   cout<<i<<" "<<cur.fi<<" "<<cur.se<<endl;
        if(!(cur.fi<=v && v<=cur.se)){
            res+=(1ll<<i);
            jumpl=cur.fi;
            jumpr=cur.se;
        }
    }
    return res+1;
}

int main() {
    cin>>n>>k>>m;
    ll u, v;
    vector<ll> lt;
    vector<ll> rt;
    for(int i=1; i<=m; i++){
        cin>>u>>v;
        if(u>v)lt.pb(i);
        else rt.pb(i);
        if(u>v)swap(u, v);
        road[i].fi=u; road[i].se=v;
    }
    for(auto id:rt){
        pll el=road[id];
        ll end=min(n+1, el.fi+k);
        ev[el.fi].pb({1, id});
        ev[end].pb({-1, id});
    }
    for(int i=1; i<=n; i++){
        gol[i]=i;
        gor[i]=i;
    }
    set<pll> op;
    for(int i=1; i<=n; i++){
        for(auto el: ev[i]){
            if(el.fi==-1)op.erase({road[el.se].se, el.se});
            else op.insert({road[el.se].se, el.se});
        }
        ev[i].clear();
        if(op.size()>0)gor[i]=max(gor[i], (*op.rbegin()).fi);
        else gor[i]=i;//or -inf
    }
    for(int i=0; i<=n+1; i++)ev[i].clear();
    op.clear();
    for(auto id:lt){
        pll el=road[id];
        ll end=max(0ll, el.se-k);
        ev[el.se].pb({1, id});
        ev[end].pb({-1, id});
    }
    for(int i=n; i>=1; i--){
        for(auto el: ev[i]){
            if(el.fi==-1)op.erase({road[el.se].fi, el.se});
            else op.insert({road[el.se].fi, el.se});
        }
        if(op.size()>0)gol[i]=min(gol[i], (*op.begin()).fi);
        else gol[i]=i; // or inf
    }
    for(int i=0; i<=22; i++){
        build(1, 1, n, i);
    }
    cin>>q;
   // cout<<" --" <<endl;
    while(q--){
        cin>>u>>v;
        cout<<qu(u, v)<<endl;
    }
    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...