#include using namespace std; #define int long long #define app push_back #define all(x) (x).begin(),(x).end() #ifdef LOCAL #define debug(...) [](auto...a){ ((cout << a << ' '), ...) << endl;}(#__VA_ARGS__, ":", __VA_ARGS__) #else #define debug(...) #endif #ifdef LOCAL #define __int128 long long #endif // LOCAL const int inf=1e18; const int maxn=2e5+5; int a[maxn];int col[maxn];bool used[maxn];int h[maxn];int de[maxn];int u[maxn][20];bool cy[maxn];int di[maxn]; int me[maxn]; int mo[maxn]; int f[maxn]; vector ps; vector mem[maxn]; int32_t main() { ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n,l,r;cin>>n>>l>>r; set unu; f[0]=0;fill(f+1,f+maxn,inf); for(int i=1;i<=n;++i) unu.insert(i); queue q;q.push(0); while(!q.empty()) { int x=q.front();q.pop(); set::iterator it=unu.lower_bound(x+l); while(it!=unu.end() && (*it)<=x+r) { f[*it]=f[x]+1;q.push(*it); unu.erase(it); it=unu.lower_bound(x+l); } } for(int i=1;i<=n;++i) {cin>>a[i];u[i][0]=a[i];} for(int j=1;j<20;++j) {for(int i=1;i<=n;++i) {u[i][j]=u[u[i][j-1]][j-1];}} for(int i=1;i<=n;++i) {cy[u[i][19]]=true;} for(int i=1;i<=n;++i) { if(cy[i] && !used[i]) { int x=i;int c=0; while(true) { col[x]=i; h[x]=c; ++c; x=a[x]; if(x==i) break; } de[i]=c; ps.app(de[i]); } } for(int i=1;i<=n;++i) { if(cy[i]) {me[i]=i;continue;} di[i]=0; int x=i; for(int j=19;j>=0;--j) { if(!cy[u[x][j]]) { di[i]+=(1<bool { return ((l+2*p-1-x)/p!=(r+2*p-x)/p); }; for(int p:ps) { vector ans(mo[p]+p+1);fill(all(ans),inf);ans[0]=0; set unuse;for(int i=1;i q;q.push(0); while(!q.empty()) { int x=q.front();q.pop(); int wis=x+l;for(int i=20;i>=0;--i) {if(wis-p*(1<=((int) (ans.size()))) wis-=p*(1<=ans.size()) wis-=p; debug(x,wis); set::iterator it=unuse.lower_bound(wis); while(it!=unuse.end() && (*it)<=x+r && ok(p,(*it)-x)) { int v=(*it); unuse.erase(it); if(v>=ans.size()) {v-=p;} if(ans[v]==inf) {ans[v]=ans[x]+1;q.push(v);} if(unuse.count(v)) unuse.erase(v); it=unuse.lower_bound(wis); } } for(int i=ans.size()-1-p;i>=0;--i) {ans[i]=min(ans[i],ans[i+p]);} debug(ans.size()); for(int x:ans) debug(x); mem[p]=ans; } auto up=[&](int x,int h) { for(int i=19;i>=0;--i) { if(h & (1<>q1; while(q1--) { int x,y;cin>>x>>y; if(col[me[x]]!=col[me[y]]) { cout<<(-1)<<'\n'; continue; } if(!cy[y]) { if(di[x]=0;--i) { if(o-p*(1<=((int) (mem[p].size()))) {o-=p*(1<