#pragma GCC optimize("O3,unroll-loops")
#include<bits/stdc++.h>
using namespace std;
#define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define inf 1e18
#define int long long 
struct q{
    int a , b , idx ;
};
const int N = 50005 ;
int k , n , m , o ;
vector <array <int , 2> > adj[N] ;
vector <array <int , 2> > radj[N] ;
int dis[N] , rdis[N] , ans[10004] ;
vector <q> qu ;
priority_queue <array <int , 2> > pq ;
void cal(int node) {
    for(int i = 0 ; i < n ; i ++) dis[i] = rdis[i] = inf ;
    dis[node] = 0 ;
    pq.push({0 , node}) ;
    
    while(!pq.empty()) {
        auto v = pq.top() ;
        pq.pop() ;
        int cd = -v[0] ;
        int node = v[1] ;
        if(cd != dis[node]) continue ;
        for(auto &nxt : adj[node]) {
            int w = nxt[1] ;
            int to = nxt[0] ;
            if(cd + w < dis[to]) {
                dis[to] = cd + w ;
                pq.push({-dis[to] , to}) ;
            }
        }
    }
    rdis[node] = 0 ;
    pq.push({0 , node}) ;
    while(!pq.empty()) {
        auto v = pq.top() ;
        pq.pop() ;
        int cd = -v[0] ;
        int node = v[1] ;
        if(cd != rdis[node]) continue ;
        for(auto &nxt : radj[node]) {
            int w = nxt[1] ;
            int to = nxt[0] ;
            if(cd + w < rdis[to]) {
                rdis[to] = cd + w ;
                pq.push({-rdis[to] , to}) ;
            }
        }
    }
}
void f(int l , int r , vector <q> &qu) {
    if(l > r) return ;
    if(qu.empty()) return ;
    int mid = (l + r) / 2 ;
    vector <q> lf , rf ;
    // mid , mid + 1 , mid + k - 1 
    for(int i = mid * k ; i <= mid * k + k - 1 ; i ++) {
        cal(i) ;
        for(auto &q : qu) {
            ans[q.idx] = min(ans[q.idx] , rdis[q.a] + dis[q.b]) ;
        }
    }
    for(auto &q : qu) {
        
        if(q.a < mid * k && q.b < mid * k) lf.push_back(q) ;
        if(q.a > mid * k + k - 1 && q.b > mid * k + k - 1) rf.push_back(q) ;
    }
    if(l <= mid - 1) f(l , mid - 1 , lf) ;
    if(mid + 1 <= r) f(mid + 1 , r , rf) ;
}
void solve() {
       
    cin >> k >> n >> m >> o ;
    while(n % k != (k - 1)) n ++ ;
    for(int i = 0 ; i < m ; i ++) {
        int u , to , w ;
        cin >> u >> to >> w ;
        adj[u].push_back({to , w}) ;
        radj[to].push_back({u , w}) ;
    }
    for(int i = 0 ; i < o ; i ++) {
        int a , b ;
        cin >> a >> b ;
        qu.push_back({a , b , i}) ;
        ans[i] = inf ;
    }
    f(0 , n / k , qu) ;
    for(int i = 0 ; i < o ; i ++) cout << (ans[i] == inf ? -1 : ans[i]) << " " ;
    cout << endl ;
}
int32_t main() {
    fastio();
  
    
    int testcase = 1;
    //cin >> testcase;
    
    for(int t = 1 ; t <= testcase ; t ++) {
     // cout << "Case #" << t << ": " ;
      solve() ;
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |