Pagini recente » Cod sursa (job #694164) | Cod sursa (job #1800858) | Cod sursa (job #2158154) | Cod sursa (job #5628) | Cod sursa (job #66767)
Cod sursa(job #66767)
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
#define Tmax 3650
#define Nmax 160
#define pb push_back
#define int short
int best[Tmax][Nmax];
int ev[Tmax][Nmax];
vector<int> l[Nmax], c[Nmax];
void fuck(int i,int j)
{
if(best[i+1][j] < best[i][j] + ev[i+1][j])
best[i+1][j] = best[i][j] + ev[i+1][j];
int b = best[i][j];
for (int k=0;k<l[j].size();++k)
{
int ora = i + c[j][k];
int v = l[j][k];
if(ora < Tmax && b + ev[ora][v] > best[ora][v])
best[ora][v] = b + ev[ora][v];
}
}
#undef int
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
int n,m,k,p,a,b,C;
scanf("%d %d %d %d",&n,&m,&k,&p);
while(m--)
{
scanf("%d %d %d",&a,&b,&C);
--a, --b;
l[a].pb(b); c[a].pb(C);
l[b].pb(a); c[b].pb(C);
}
while(k--)
{
scanf("%d %d %d",&a,&b,&C);
ev[b][a-1] += C;
}
for (int i=0;i<Tmax;++i)
memset(best[i],-1,sizeof(best[i]));
best[0][0] = ev[0][0];
fuck(0,0);
for (int i=1;i<=3521;++i)
for (int j=0;j<n;++j)
if(best[i][j] >= 0)
fuck(i,j);
for (int i=1;i<=p;++i)
{
scanf("%d %d",&b,&a);
printf("%d\n",best[a][b-1]);
}
return 0;
}