Cod sursa(job #320187)
#include <cstdio>
#include <vector>
using namespace std;
#define MAX_N 155
#define MAX_T 3505
#define INF 0x3f3f3f
#define x first
#define c second
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
vector <pair<int, int> > G[MAX_N];
int N, M, K, P;
int A[MAX_T][MAX_N], S[MAX_T][MAX_N];
void citire()
{
scanf("%d %d %d %d",&N, &M, &K, &P);
for(int i = 1; i <= M; ++i)
{
int a, b, c;
scanf("%d %d %d",&a, &b, &c);
G[a].push_back(make_pair(b, c));
G[b].push_back(make_pair(a, c));
}
for(int i = 1; i <= K; ++i)
{
int a, b, c;
scanf("%d %d %d",&a, &b, &c);
A[b][a] += c;
}
}
void pre()
{
for(int i = 2; i <= N; ++i)
S[0][i] = -INF;
for(int i = 1; i <= MAX_T; ++i)
for(int j = 1; j <= N; ++j)
{
S[i][j] = S[i-1][j];
foreach(G[j])
{
int x = it -> x;
int t = it -> c;
if(i < t) continue;
S[i][j] = max(S[i][j], S[i - t][x]);
}
S[i][j] += A[i][j];
}
}
int main()
{
freopen("amenzi.in","rt",stdin);
freopen("amenzi.out","wt",stdout);
citire();
pre();
while(P--)
{
int a, b, rez(-1);
scanf("%d %d",&a, &b);
if(S[b][a]) rez = S[b][a];
printf("%d\n",rez);
}
}