Cod sursa(job #66774)

Utilizator crawlerPuni Andrei Paul crawler Data 21 iunie 2007 01:11:44
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <string.h>
#include <vector>

using namespace std;

#define Tmax 3650
#define Nmax 160
#define pb push_back

int best[Tmax][Nmax];
int ev[Tmax][Nmax];

vector<int> l[Nmax], c[Nmax];

void fuck(int i,int j)
{
	#define b (best[i][j])

	if(best[i+1][j] < b + ev[i+1][j])
		best[i+1][j] = b + ev[i+1][j];

	for (int k=0;k<l[j].size();++k)
	{
		#define ora (i + c[j][k])
		#define v (l[j][k])
		if(ora < Tmax && b + ev[ora][v] > best[ora][v])
			best[ora][v] = b + ev[ora][v];
	}	
	#undef b
	#undef v
	#undef ora
}	

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;
}