前向星+fread+fwrite+特判+多次提交才卡过
为什么?
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ll;
typedef pair<ll,int> pii;
const int N=2e5+5;
const int M=4e5+5;
namespace BIO {
char buf[1<<20],*p1,*p2;
inline char bgetc() {
if(p1==p2) {
p2=(p1=buf)+fread(buf,1,1<<20,stdin);
}
return (p1==p2)?EOF:*p1++;
}
inline ll Read() {
register ll n=0;
register char c=bgetc();
while(c<'0'||'9'<c) {
c=bgetc();
}
while('0'<=c&&c<='9') {
n=n*10+c-48,c=bgetc();
}
return n;
}
short wrstk[100],wrtop;
inline void wr(ll x) {
if(x<0) {
putchar('-');
x=-x;
}
wrtop=0;
do {
wrstk[++wrtop]=x%10;
x/=10;
} while(x);
while(wrtop) {
putchar(wrstk[wrtop--]+48);
}
}
};
int n,m;
struct edge{
int u,v;
ll w;
};
edge E[M];
struct ED{
int v;
ll w;
int nxt;
}e[2*M];
int ec,hd[N];
inline void add(int u,int v,ll w){
e[++ec]={v,w,hd[u]};
hd[u]=ec;
}
inline bool cmp(edge x,edge y){
return x.w>y.w;
}
int u,v;
ll c,w;
int q;
ll K,S;
ll dis[N];
bool vis[N];
priority_queue<pii,vector<pii>,greater<pii>>pq;
inline void dij(int stt){
for(int i=1;i<=n;i++){
vis[i]=0;
dis[i]=4e9;
}
pq.push({0,stt});
dis[stt]=0;
int u;
while(!pq.empty()){
u=pq.top().second;
pq.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=hd[u];i;i=e[i].nxt){
if(dis[e[i].v]>dis[u]+e[i].w){
dis[e[i].v]=dis[u]+e[i].w;
pq.push({dis[e[i].v],e[i].v});
}
}
}
}
int idx;
int fa[2*N];
int find(int x){
if(fa[x]==0)return x;
return fa[x]=find(fa[x]);
}
int tr[2*N][2];
int p[2*N];
ll res[2*N];
void dfs(int u){
if(u<=n){
res[u]=dis[u];
}
else{
res[u]=4e9;
}
for(int i=0;i<=1;i++){
if(tr[u][i]){
dfs(tr[u][i]);
res[u]=min(res[u],res[tr[u][i]]);
}
}
}
int lt[2*N][22];
inline int Qp(int u,int w){
for(int i=20;i>=0;i--){
if(lt[u][i]&&p[lt[u][i]]>w){
u=lt[u][i];
}
}
return u;
}
inline void slove(){
n=BIO::Read();
m=BIO::Read();
ec=0;
for(int i=1;i<=n;i++){
hd[i]=0;
dis[i]=0;
vis[i]=0;
}
for(int i=1;i<=2*n;i++){
res[i]=0;
p[i]=0;
fa[i]=0;
tr[i][0]=0;
tr[i][1]=0;
}
idx=n;
bool sub=1;
for(int i=1;i<=m;i++){
u=BIO::Read();
v=BIO::Read();
c=BIO::Read();
w=BIO::Read();
E[i]={u,v,w};
add(u,v,c);
add(v,u,c);
if(w!=1){
sub=0;
}
}
q=BIO::Read();
K=BIO::Read();
S=BIO::Read();
dij(1);
if(sub){
ll lastans=0;
for(int i=1;i<=q;i++){
v=BIO::Read();
w=BIO::Read();
v=(v+K*lastans-1)%n+1;
w=(w+K*lastans)%(S+1);
if(w<1){
lastans=0;
}
else{
lastans=dis[v];
}
BIO::wr(lastans);
putchar('\n');
}
return ;
}
sort(E+1,E+1+m,cmp);
int fx,fy;
for(int i=1;i<=m;i++){
fx=find(E[i].u);
fy=find(E[i].v);
if(fx!=fy){
idx++;
tr[idx][0]=fx;
tr[idx][1]=fy;
fa[fx]=fa[fy]=idx;
p[idx]=E[i].w;
}
}
for(int i=1;i<=idx;i++){
fa[i]=0;
}
for(int i=1;i<=idx;i++){
for(int v=0;v<=1;v++){
fa[tr[i][v]]=i;
}
}
for(int i=idx;i>=1;i--){
if(!res[i]){
dfs(i);
}
}
for(int i=1;i<=idx;i++){
lt[i][0]=fa[i];
}
for(int j=1;j<=19;j++){
for(int i=1;i<=idx;i++){
lt[i][j]=lt[lt[i][j-1]][j-1];
}
}
if(K==0){
for(int i=1;i<=q;i++){
v=BIO::Read();
w=BIO::Read();
BIO::wr(res[Qp(v,w)]);
putchar('\n');
}
}
else{
ll lastans=0;
for(int i=1;i<=q;i++){
v=BIO::Read();
w=BIO::Read();
v=(v+K*lastans-1)%n+1;
w=(w+K*lastans)%(S+1);
lastans=res[Qp(v,w)];
BIO::wr(lastans);
putchar('\n');
}
}
}
int main(){
int T;
T=BIO::Read();
while(T--){
slove();
}
return 0;
}