Pagini recente » Cod sursa (job #2399162) | Cod sursa (job #846405) | Cod sursa (job #26435) | Cod sursa (job #2412034) | Cod sursa (job #3139829)
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define dl double
#define st first
#define nd second
#define II pair <int, int>
using namespace std;
const int N = 3501;
const int inf = 7 + 1e9;
vector <vector <II>> adj;
vector <vector <int>> cost, f;
int main() {
#define TASKNAME "amenzi"
ios_base :: sync_with_stdio (0);
cin.tie (0);
if ( fopen( TASKNAME".in", "r" ) ) {
freopen (TASKNAME".in", "r", stdin);
freopen (TASKNAME".out", "w", stdout);
}
int n, m, k, q;
cin >> n >> m >> k >> q;
adj.resize(n + 1);
for (int i = 1; i <= m; i ++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
cost.assign(n + 1, vector <int> (N, 0));
for (int i = 1; i <= k; i ++) {
int u, t, c;
cin >> u >> t >> c;
cost[u][t] += c;
}
f.assign(n + 1, vector <int> (N, -1));
f[1][0] = 0;
for (int time = 0; time < N; time ++)
for (int u = 1; u <= n; u ++) {
f[u][time] = max(f[u][time], (time > 0 ? f[u][time - 1] : -inf));
if (f[u][time] >= 0)
f[u][time] += cost[u][time];
for (auto z : adj[u])
if (time + z.nd < N)
f[z.st][time + z.nd] = max(f[z.st][time + z.nd], f[u][time]);
}
while (q --) {
int u, t;
cin >> u >> t;
cout << f[u][t] << '\n';
}
return 0;
}