提交时间:2024-11-28 17:30:51
运行 ID: 35196
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=200010,MAXM=510,N=22,inf=1e9; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT=1;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;} int n,q,k,L,R,a[MAXN]; int vis[MAXN],cnt,p[MAXN]; int dfs(int u){ if(vis[u])return u; vis[u]=1; for(inx(u)){ int tmp=dfs(v); if(tmp){ vis[u]=-1; p[++cnt]=u; return tmp==u?0:tmp; } } return 0; } int bel[MAXN],lp[MAXN],dep[MAXN],c[MAXN],s[MAXN],dfn[MAXN],ed[MAXN],tot,tk[MAXN]; vector<int>f[MAXN]; int dfs2(int u,int bl){ vis[u]=-1; dfn[u]=++tot; tk[u]=k; bel[u]=bl; int res=1; for(inx(u))if(vis[v]!=-1)dep[v]=dep[u]+1,res+=dfs2(v,bl); ed[u]=tot; return res; } int fa[MAXN],as[MAXN]; int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} void mrge(int x,int y){int u=fid(x),v=fid(y);if(u!=v)fa[u]=v;} void init(int x){for(int i=1;i<=x+1;i++)fa[i]=i;} void upd(int l,int r,int x){ // if(k==16&&x<=100)cout<<l<<" "<<r<<" "<<x<<" "<<s[k]<<" "<<c[k]<<" "<<((l-s[k])/c[k])*c[k]<<endl; if(l>s[k])r-=((l-s[k]-1)/c[k]+1)*c[k],l-=((l-s[k]-1)/c[k]+1)*c[k]; r=min(r,s[k]+c[k]); int now=fid(l); while(now<=r){ as[now]=x; mrge(now,now+1); now=fid(now); } } void slv(){ n=read(),L=read(),R=read(); for(int i=1;i<=n;i++)a[i]=read(),add_side(a[i],i);//,cout<<a[i]<<" "<<i<<endl; for(int i=1;i<=n;i++)if(!vis[i]){k++; cnt=tot=0; dfs(i); c[k]=cnt; for(int j=1;j<=cnt;j++)s[k]+=dfs2(p[j],j);//,cout<<p[j]<<" ";cout<<endl; init(s[k]+c[k]); for(int j=s[k]+c[k];j>=1;j--)as[j]=inf; for(int j=1;j<=s[k];j++)upd(j*L,j*R,j); for(int j=s[k];j>=1;j--)as[j]=min(as[j],as[j+c[k]]); f[k].pb(0); for(int j=1;j<=s[k]+c[k];j++)f[k].pb(as[j]);//,cout<<as[j]<<" ";cout<<endl; // for(int j=1;j<=s[k]+c[k];j++)if(j<=50)cout<<as[j]<<" ";cout<<endl; } // for(int i=1;i<=n;i++)cout<<tk[i]<<" ";cout<<endl; // for(int i=1;i<=n;i++)cout<<bel[i]<<" ";cout<<endl; // for(int i=1;i<=n;i++)cout<<dfn[i]<<" ";cout<<endl; q=read(); while(q--){ int x=read(),y=read(); if(tk[x]!=tk[y])printf("-1\n"); else if(dep[y]){ if(dfn[x]>=dfn[y]&&dfn[x]<=ed[y])printf("%d\n",dep[x]-dep[y]); else printf("-1\n"); } else{ int tmp=(bel[y]-bel[x]+c[tk[x]])%c[tk[x]]; // cout<<tmp<<" "<<dep[x]<<" "<<bel[x]<<" "<<bel[y]<<" "<<c[tk[x]]<<" "<<tk[x]<<endl; printf("%d\n",f[tk[x]][tmp+dep[x]]>=inf?-1:f[tk[x]][tmp+dep[x]]); } } } signed main(){ slv(); return 0; }