写了一个下午,寄
#include<bits/stdc++.h>
using namespace std;
struct edge{
int nxt, u, v;
long long l, a;
bool operator < (const edge &e) const{
return a > e.a;
}
};
int T;
int N, M, P = 1, Q, K, tot;
int u, v;
int lastans = 0, s, p;
long long l, a, S;
int head[400005];
long long dis[4000005];
bool vis[400005];
edge E[2000006];
int F[400005], fastfa[400005];
long long high[400005] = {-1};
int st[35][400005];
vector<int> son[400005];
int h[400005];
void addedge(int u, int v, long long l, long long a){
E[++ P] = {head[u], u, v, l, a};
head[u] = P;
}
int find(int x){
if (fastfa[x] == x) return x;
fastfa[x] = find(fastfa[x]);
return fastfa[x];
}
void merge(int x, int y, int z){
int fx = find(x), fy = find(y), fz = find(z);
if (fx == fy) return;
F[fx] = F[fy] = fz;
fastfa[fx] = fastfa[fy] = fz;
dis[fz] = min(dis[fx], dis[fy]);
}
void dijkstra(int s){
dis[s] = 0;
priority_queue<pair<long long, int>, vector<pair<long long, int> >, greater<pair<long long, int> > > q;
q.push({0, s});
while (q.size()){
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = head[u]; i; i = E[i].nxt){
int v = E[i].v, w = E[i].l;
if (dis[v] <= dis[u] + w) continue;
dis[v] = dis[u] + w;
q.push({dis[v], v});
}
}
}
void erg(int u, int dep){
h[u] = dep;
st[0][u] = F[u];
for (int i = 1; i <= __lg(dep); i ++){
st[i][u] = st[i - 1][st[i - 1][u]];
}
for (auto && v : son[u]){
erg(v, dep + 1);
}
}
long long operate(int x){
for (int i = __lg(h[x]); i >= 0; i --){
if (high[st[i][x]] <= p) continue;
x = st[i][x];
}
return dis[x];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("../data.in", "r", stdin);
freopen("../data.out", "w", stdout);
#endif
scanf("%d", &T);
while (T --){
scanf("%d %d", &N, &M);
tot = N, P = 1;
for (int i = 1; i <= N; i ++){
dis[i] = 0x3f3f3f3f3f3f3f3fLL;
vis[i] = 0;
high[i] = 0x3f3f3f3f3f3f3f3fLL;
head[i] = 0;
}
for (int i = 1; i <= 2 * N; i ++){
fastfa[i] = F[i] = i;
}
for (int i = 0; i < M; i ++){
scanf("%d %d %lld %lld", &u, &v, &l, &a);
addedge(u, v, l, a);
addedge(v, u, l, a);
}
scanf("%d %d %lld", &Q, &K, &S);
dijkstra(1);
sort(E + 2, E + P + 1);
for (int i = 2; i <= P; i ++){
int u = E[i].u, v = E[i].v;
if (find(u) == find(v)) continue;
merge(u, v, ++ tot);
high[tot] = E[i].a;
}
F[tot] = 0;
for (int i = 0; i <= tot; i ++) son[i].clear();
for (int i = 1; i < tot; i ++){
son[F[i]].push_back(i);
}
erg(tot, 1);
for (int i = 1; i <= Q; i ++){
scanf("%d %d", &s, &p);
s = (s + K * lastans - 1) % N + 1;
p = (p + K * lastans) % (S + 1);
//cout << s << " " << p << ":::\n";
long long ans = operate(s);
/*
while(1){
ans = dis[s];
if (F[s] == 0) break;
s = F[s];
if (high[s] <= p) break;
}
*/
lastans = ans;
printf("%lld\n", ans);
}
}
return 0;
}
WA 7 9 10 1115 16 17 18 19