记录编号 539500 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2018]归程 最终得分 100
用户昵称 Gravatar瑆の時間~無盡輪迴·林蔭 是否通过 通过
代码语言 C++ 运行时间 12.642 s
提交时间 2019-08-07 16:11:27 内存使用 264.67 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm> 
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
struct P
{
	int x,y,a,l;
};
P t[800001],ls[800001],nt[800001];
int headl[800001],headn[800001];
//vector<pair<int,long long int> >ls[800001];
//vector<long long int> nt[800001];
long long int val[800001];
bool vis[800001];
long long int dis[800001];
long long int fat[800001];
long long int T,n,m,a1,a2,a3,a4,cnt,Q,K,S,tot1,tot2;
priority_queue<pair<long long int,long long int> > q;
void ADDL(int x,int y,int dis)
{
	ls[++tot1].l=dis;
	ls[tot1].y=y;
	ls[tot1].a=headl[x];
	headl[x]=tot1; 
}
void ADDN(int x,int y)
{
	nt[++tot2].y=y;
	nt[tot2].a=headn[x];
	headn[x]=tot2;
}
int FIND(long long int x)
{
	if(x==fat[x])
	{
		return x;
	}
	return fat[x]=FIND(fat[x]);
}
void DIJ()
{
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f3f3f3f,sizeof(dis));
	dis[1]=0;
	q.push(make_pair(0,1));
	while(!q.empty())
	{
		long long int u=q.top().second;
		q.pop();
		if(vis[u])
			continue;
		vis[u]=1;
		for(int i=headl[u];i;i=ls[i].a)
		{
			long long int v=ls[i].y;
			if(dis[u]+ls[i].l<dis[v])
			{
				dis[v]=dis[u]+ls[i].l;
				q.push(make_pair(-dis[v],v));
			}
		}
	}
}
bool Function(P a,P b)
{
	return a.a>b.a;
}
long long int far[800001];
long long int gra[800001][30];
void DFS(int x)
{
	far[x]=dis[x];
	for(int i=headn[x];i;i=nt[i].a)
	{
		gra[nt[i].y][0]=x;
		DFS(nt[i].y);
		far[x]=min(far[x],far[nt[i].y]);
	}
}
long long int read()
{
    long long int f=1,x=0;
    char ss=getchar();
    while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
    while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
    return f*x;
}
int main()
{
	freopen("noi2018_return.in","r",stdin);
	freopen("noi2018_return.out","w",stdout);
	T=read();
	while(T--)
	{
		memset(gra,0,sizeof(gra)); 
		memset(far,0,sizeof(far));
		memset(val,0,sizeof(val));
		memset(headl,0,sizeof(headl));
		memset(headn,0,sizeof(headn));
		tot1=tot2=0;
		cnt=0;
		n=read();
		m=read();
		for(int i=1;i<=m;i++)
		{
			a1=read();
			a2=read();
			a3=read();
			a4=read();
			t[i].x=a1;
			t[i].y=a2;
			t[i].a=a4;
			//ls[a1].push_back(make_pair(a2,a3));
			//ls[a2].push_back(make_pair(a1,a3));
			ADDL(a1,a2,a3);
			ADDL(a2,a1,a3);
		}
		for(int i=1;i<=n;i++)
		{
			fat[i]=i;
		}
		DIJ();
		sort(t+1,t+1+m,Function);
		cnt=n;
		for(int i=1;i<=m;i++)
		{
			int xl=t[i].x;
			int yl=t[i].y;
			xl=FIND(xl);
			yl=FIND(yl);
			if(xl!=yl)
			{
				++cnt;
				fat[xl]=fat[yl]=fat[cnt]=cnt;
				val[cnt]=t[i].a;
				ADDN(cnt,xl);
				ADDN(cnt,yl);
				//nt[cnt].push_back(xl);
				//nt[cnt].push_back(yl); 
			}
		}
		DFS(cnt);
		for(int i=1;(1<<i)<=cnt;i++)
		{
			for(int j=1;j<=cnt;j++)
			{
				gra[j][i]=gra[gra[j][i-1]][i-1];
			}
		}
		Q=read();
		K=read();
		S=read();
		long long int lastans=0;
		while(Q--)
		{
			a1=read();
			a2=read();
			a1=(a1+K*lastans-1)%n+1;
			a2=(a2+K*lastans)%(S+1);
			for(int j=22;j>=0;--j)
			{
				if(gra[a1][j]&&val[gra[a1][j]]>a2)
				{
					a1=gra[a1][j];
				}
			}
			printf("%lld\n",lastans=far[a1]);
		}
	}
	return 0;
}