求助这个代码复杂度是否正确,应在何处优化
#include <bits/stdc++.h>
using namespace std;
namespace INPUT_SPACE{
const int BS=(1<<24)+5;char Buffer[BS],*HD,*TL;inline int gc() { if(HD==TL) TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);return (HD==TL)?EOF:*HD++; }
inline int inn() { int x,ch;while((ch=gc())<'0'||ch>'9');x=ch^'0';while((ch=gc())>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^'0');return x; }
}using INPUT_SPACE::inn;
int t;
int n,m;
int js=0;
struct nodee{
int fromm,too,nextt,l,aa;
}a[800007];
int headd[800007];
long long dis[800007];
bool vis[800007];
int v,p;
int q,k,s;
long long ans;
int fa[800007];
int root[800007];
int toproot[800007];
int broot[800007][31];
int maxn[800007];
int dep[800007];
int l[800007],r[800007];
int poee[27];
int zz;
inline int read()
{
int f=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
f=f*10+c-'0';
c=getchar();
}
return f;
}
void dfs(int x,int h)
{
if(x==0)
return;
dep[x]=h;
/* if(x==2)
cout<<root[x]<<endl;*/
broot[x][0]=root[x];
int jl=broot[x][0];
for(register int i=1;i<=18;++i)
{
if(!broot[jl][i-1])
break;
broot[x][i]=broot[jl][i-1];
jl=broot[jl][i-1];
}
dfs(l[x],h+1);
dfs(r[x],h+1);
}
inline void add(int fromm,int too,int l,int aa)
{
++js;
a[js].fromm=fromm;
a[js].too=too;
a[js].l=l;
a[js].aa=aa;
a[js].nextt=headd[fromm];
headd[fromm]=js;
}
inline void dij()
{
for(register int i=1;i<=n;++i)
{
dis[i]=1e18;
vis[i]=0;
}
priority_queue <pair<int,int> >q;
dis[1]=0;
q.push(make_pair(-dis[1],1));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(register int i=headd[u];i;i=a[i].nextt)
{
if(dis[a[i].too]>dis[u]+a[i].l)
{
dis[a[i].too]=dis[u]+a[i].l;
q.push(make_pair(-dis[a[i].too],a[i].too));
}
}
}
/* for(register int i=1;i<=n;++i)
cout<<dis[i]<<" ";*/
}
inline int find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find(fa[x]);
}
inline int find2(int x)
{
if(toproot[x])
{
toproot[x]=find2(toproot[x]);
return toproot[x];
}
return x;
}/*
inline int find2(int x,int js)
{
cout<<x<<" "<<js<<endl;
if(toproot[x])
{
toproot[x]=find2(toproot[x],js+1);
return toproot[x];
}
return x;
}*/
inline void make_root(int u,int v,int hi)//**暴力找根
{
u=find2(u);
v=find2(v);
// cout<<u<<" "<<v<<endl;
++zz;
root[u]=root[v]=zz;
l[zz]=u;
r[zz]=v;
toproot[u]=toproot[v]=zz;
maxn[zz]=hi;
dis[zz]=min(dis[u],dis[v]);
}
inline void kru()
{
zz=n;
priority_queue<pair<int,int> >q;
for(register int i=2;i<=2*m;i+=2)
q.push(make_pair(a[i].aa,i));
int jss=2;
while(jss<2*n)
{
int s=q.top().second;
q.pop();
int u=a[s].fromm;
int v=a[s].too;
int fu=find(u);
int fv=find(v);
if(fu==fv)
continue;
fa[fu]=fv;
// cout<<u<<" "<<v<<" "<<s<<endl;
make_root(u,v,a[s].aa);
jss+=2;
}
}
/*inline void kru()
{
zz=n;
priority_queue<pair<int,int> >q;
for(register int i=2;i<=2*m;i+=2)
q.push(make_pair(a[i].aa,i));
int jss=2;
int c=1;
while(c<200000)
{
// cout<<c++<<endl;
c++;
int s=q.top().second;
q.pop();
int u=a[s].fromm;
int v=a[s].too;
int fu=find(u);
int fv=find(v);
//if(fu==fv)
//continue;
// fa[fu]=fv;
// cout<<u<<" "<<v<<" "<<s<<endl;
// make_root(u,v,a[s].aa);
jss+=2;
}
cout<<c;
}*/
/*inline long long find3(int v,int p)
{
maxn[v]=INT_MAX;
while(maxn[root[v]]>p)
v=root[v];
return dis[v];
}*/
inline long long find3(int v,int p)
{
maxn[v]=INT_MAX;
if(maxn[root[v]]<=p)
return dis[v];
while(v!=0)
{
// cout<<v<<" ";
int c=1;//c==0
while(maxn[broot[v][c]]>p)
++c;
--c;
c=max(0,c);
v=broot[v][c];
if(maxn[v]>p&&maxn[root[v]]<=p)
break;
}
return dis[v];
}
int main()
{
// freopen("return5.in","r",stdin);
// freopen("return5.out3","w",stdout);
poee[0]=1;
for(register int i=1;i<=18;++i)
poee[i]=poee[i-1]*2;
t=inn();
for(int ii=1;ii<=t;++ii)
{
for(register int i=1;i<=js;++i)
{
a[i].nextt=a[i].fromm=a[i].too=0;
}
for(register int i=1;i<=n;++i)
headd[i]=0;
n=inn();
m=inn();
js=0;
int fromm,too,l,aa;
for(register int i=1;i<=m;++i)
{
// scanf("%d%d%d%d",&fromm,&too,&l,&aa);
fromm=inn();
too=inn();
l=inn();
aa=inn();
add(fromm,too,l,aa);
add(too,fromm,l,aa);
}
/*for(register int i=1;i<=m;++i)
{
// scanf("%d%d%d%d",&fromm,&too,&l,&aa);
fromm=i;
too=;
l=1;
aa=1;
add(fromm,too,l,aa);
add(too,fromm,l,aa);
}*/
dij();
for(register int i=1;i<=n;++i)
maxn[i]=fa[i]=i;
for(register int i=1;i<=2*n;++i)
{
toproot[i]=root[i]=0;
for(register int j=0;j<=18;++j)
broot[i][j]=0;
}
kru();
dfs(zz,1);
ans=0;
// scanf("%d%d%d",&q,&k,&s);
q=inn();
k=inn();
s=inn();
for(register int i=1;i<=q;++i)
{
// scanf("%d%d",&v,&p);
v=inn();
p=inn();
v=(v+k*ans-1)%n+1;
p=(p+k*ans)%(s+1);
ans=find3(v,p);
printf("%lld\n",ans);
}
}
return 0;
}