不知道为什么第 6 个点 WA 和 12、13、14 MLE了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define N 200011
#define M 400011
#define inf 1<<30
#define ll long long
using namespace std;
struct Tool
{
int x;
int y;
int z;
}tool[N+M];
struct Que
{
int data;
int rank;
friend bool operator <(const Que x,const Que y)
{
return x.data>y.data;
}
};
struct Node
{
int t;
int val;
int next;
}node[M];
priority_queue<Que>q;
int head[N+M],d[N+M],mi[N+M],book[N+M],f[N+M],fa[N+M][23],val[N+M],dep[N+M],tot=0,sz=0,n,m;
inline int read()
{
char ch=getchar();
int f=0;
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9')
{
f=f*10+ch-'0';
ch=getchar();
}
return f;
}
bool cmp1(Tool x,Tool y)
{
return x.z>y.z;
}
void init()
{
for(int i=1;i<=n;++i) f[i]=i;
return;
}
int getf(int v){return f[v]==v?v:f[v]=getf(f[v]);}
void add(int x,int y,int z)
{
node[++tot].t=y;
node[tot].val=z;
node[tot].next=head[x];
head[x]=tot;
return;
}
void dfs(int u,int fath)
{
mi[u]=d[u]; dep[u]=dep[fath]+1;
fa[u][0]=fath;
for(int i=1;(1<<i)<=dep[u];++i) fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];i;i=node[i].next)
{
int v=node[i].t;
if(v==fath) continue;
dfs(v,u);
mi[u]=min(mi[u],mi[v]);
}
}
int LCA(int x,int y)
{
for(int i=22;i>=0;--i)
if(val[fa[x][i]]>y)
x=fa[x][i];
return x;
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
int T,ans=0;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
tot=0;
sz=n; ans=0;
memset(d,0x3f,sizeof(d));
memset(mi,0x3f,sizeof(mi));
for(int i=1;i<=n+m+10;++i)
{
dep[i]=head[i]=book[i]=tool[i].x=tool[i].y=tool[i].z=0;
}
for(int i=1;i<=m;++i)
{
int u,v,l,axx;
scanf("%d %d %d %d",&u,&v,&l,&axx);
tool[i].x=u;tool[i].y=v;tool[i].z=axx;
add(u,v,l);add(v,u,l);
}
d[1]=d[0]=0;book[1]=1;
q.push((Que){0,1});
while(!q.empty())
{
Que qs=q.top();
q.pop();
book[qs.rank]=1;
int u=qs.rank;
for(int i=head[u];i;i=node[i].next)
{
int v=node[i].t;
if(d[v]>d[u]+node[i].val)
{
d[v]=d[u]+node[i].val;
if(!book[v]) q.push((Que){d[v],v});
}
}
}
/*for(int i=1;i<=n;++i) printf("%d ",d[i]);
cout<<endl;*/
int Q,K,S;
scanf("%d %d %d",&Q,&K,&S);
sort(tool+1,tool+m+1,cmp1);
init();
memset(head,0,sizeof(head));
memset(fa,0,sizeof(fa));
tot=0;
for(int i=1;i<=m;++i)
{
int x=tool[i].x,y=tool[i].y;
int t1=getf(x),t2=getf(y);
if(t2!=t1)
{
++sz;
f[t1]=f[t2]=f[sz]=sz;
add(sz,t1,0); add(sz,t2,0);
val[sz]=tool[i].z; d[sz]=inf;
}
}
dfs(sz,0);
for(int i=1;i<=Q;++i)
{
int V,P;
scanf("%d %d",&V,&P);
V=(V+K*ans-1)%n+1;
P=(P+K*ans)%(S+1);
ll ans_step=LCA(V,P);
ans=mi[ans_step];
printf("%lld\n",ans);
}
}
return 0;
}