#include <bits/stdc++.h>
using namespace std;
#define sonic ios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define IO(main) if(fopen(main".inp","r")){freopen(main".inp","r",stdin);freopen(main".out","w",stdout);}
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define ins insert
#define pb push_back
#define el cout << endl
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#define MASK(i) ((1LL)<<(i))
#define BIT(x,i) (((x)>>(i))&(1LL))
#define FOR(i, a, b) for(int (i)=(a);(i)<=(b); i++)
#define FORD(i, a, b) for(int (i)=(a);(i)>=(b); i--)
using ll = long long;
#define int ll
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vii = vector<pii>;
const int N = 1e6 + 9;
const int mod = 1e9 + 7;
const ll INF = 1e18 + 7;
const int base = 31;
const int LOG = 20;
const ll MOD = 1e9 + 7;
int mul(int x, int y) {return 1LL * x * y % mod;}
int calPw(int x, int y)
{
int ans = 1;
while(y)
{
if (y&1) ans = 1LL * ans * x % mod;
x = 1LL * x * x % mod;
y >>= 1;
}
return ans;
}
int d4x[4] = {1, 0, -1, 0};
int d4y[4] = {0, 1, 0, -1};
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[8] = {1, 1, 0, -1, -1, -1, 0, 1};
///Author: Le Chi Thien Luong The Vinh high school 2008
///code
template<class X, class Y>
bool minimize(X &x , Y y){
if(x > y){
x = y;
return true;
}
return false;
}
template<class X, class Y>
bool maximize(X &x , Y y){
if(x < y){
x = y;
return true;
}
return false;
}
template<class X, class Y>
bool add(X &x , Y y){
if((x + y ) >= mod){
ll tmp = x + y;
x = tmp - mod;
return true;
}
return false;
}
void Solve(){
}
int k, n, m, q;
vector<pii>adj[N];
ll dp[N];
pii edge[N];
vector<pii>V[N];
int mx[N];
int ans[N];
void Read(){
cin >> k >> n >> m >> q;
if(k == 1){
FOR(i, 0, n)mx[i] = INF;
FOR(i, 1, m){
int u, v, w;
cin >> u >> v >> w;
mx[u] = min(mx[u], w);
adj[u].push_back({v, w});
}
FOR(i, 0, n - 1)mx[i] += mx[i - 1];
FOR(i, 1, q){
int u, v;
cin >> u >> v;
int ans = mx[v - 1] - mx[u - 1];
if(ans >= INF || ans <= 0)ans = -1;
cout << ans << endl;
}return;
}
FOR(i, 1, m){
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
}
set<int>st;
FOR(i, 1, q){
int u, v;
cin >> u >> v;
st.insert(u);
mx[u] = max(mx[u], v);
V[u].push_back({v, i});
}
for(int u : st){
queue<int>q;
FOR(i, 0, mx[u])dp[i] = INF;
dp[u] =0;
q.push(u);
while(q.size()){
int x = q.front();
q.pop();
if(x > mx[u])continue;
for(pii y : adj[x]){
if(dp[y.fi] > dp[x] + y.se){
dp[y.fi] = dp[x] + y.se;
q.push(y.fi);
}
}
}
///FOR(i, u, mx[u])cout << dp[i] << " ";el;el;
for(pii v : V[u]){
ans[v.se] = dp[v.fi];
}
}
// FOR(i, 0, n - 1)cout << i << " ";el;
// FOR(i, 0, n - 1)cout << dp[i] << " " ;
// el;
FOR(i, 1, q){
if(ans[i] == INF)ans[i] = -1;
cout << ans[i] << endl;
}
/// cout << (3/4 + 1) * k + k - 1<< endl;
}
signed main()
{
sonic;
int TEST = 1;
// cin >> TEST;
while(TEST--)
{
Read();
Solve();
}
}
# | 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... |