#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } #define COLOR(s) ("\x1b[" s "m") // element to erase must exist template struct MinPQue { priority_queue, greater> que0, que1; int size() const { return que0.size() - que1.size(); } void push(const T &t) { que0.push(t); } void erase(const T &t) { que1.push(t); } void reduce() { for (; que0.size() && que1.size() && que0.top() == que1.top(); que0.pop(), que1.pop()) {} } const T &top() { reduce(); return que0.top(); } void pop() { reduce(); que0.pop(); } }; struct Functional { int n; vector par; int cyclesLen; vector> cycles; // cycle id or -1 vector on; // forest vector> graph; // root vector rs; Functional() {} Functional(const vector &par_) : par(par_) { n = par.size(); cycles.clear(); vector vis(n, -1); for (int s = 0; s < n; ++s) { int u = s; for (; !~vis[u]; u = par[u]) { vis[u] = s; } if (vis[u] == s) { vector cycle; for (int v = u; ; ) { cycle.push_back(v); if ((v = par[v]) == u) break; } cycles.push_back(cycle); } } cyclesLen = cycles.size(); on.assign(n, -1); for (int k = 0; k < cyclesLen; ++k) { for (const int u : cycles[k]) { on[u] = k; } } graph.assign(n, {}); for (int u = 0; u < n; ++u) if (!~on[u]) { graph[par[u]].push_back(u); } rs.assign(n, -1); zeit = 0; dis.assign(n, -1); fin.assign(n, -1); dep.assign(n, -1); for (int u = 0; u < n; ++u) if (~on[u]) { dep[u] = 0; dfs(u, u); } } void dfs(int u, int r) { dis[u] = zeit++; rs[u] = r; for (const int v : graph[u]) { dep[v] = dep[u] + 1; dfs(v, r); } fin[u] = zeit; } int zeit; vector dis, fin, dep; }; constexpr int INF = 1001001001; int N, L, R; vector P; int Q; vector S, T; int main() { for (; ~scanf("%d%d%d", &N, &L, &R); ) { P.resize(N); for (int u = 0; u < N; ++u) { scanf("%d", &P[u]); --P[u]; } scanf("%d", &Q); S.resize(Q); T.resize(Q); for (int q = 0; q < Q; ++q) { scanf("%d%d", &S[q], &T[q]); --S[q]; --T[q]; } const Functional F(P); // cerr<<"cycles = "< freq(K, 0); for (int u = 0; u < N; ++u) { ++freq[F.on[F.rs[u]]]; } vector ns(K + 1), ms(K + 1); vector> cost(K + 1), costSuf(K + 1); for (int k = 0; k <= K; ++k) { int &n = ns[k]; int &m = ms[k]; if (k == K) { n = N; m = 1; } else { n = freq[k]; m = F.cycles[k].size(); } vector> addss(n + m + 1), remss(n + m + 1); for (Int x = 0; x <= n + m; ++x) { // [0, n) { Int l = L * x, r = R * x; chmin(r, n - 1); if (l <= r) { addss[l].push_back(x); remss[r + 1].push_back(x); } } // [n, n + m) { Int l = L * x, r = R * x; chmax(l, n); if (l <= r) { if (r - l >= m - 1) { addss[n].push_back(x); remss[n + m].push_back(x); } else { const Int a = (l - n) % m; const Int b = (a + (r - l)) % m; if (a <= b) { addss[n + a].push_back(x); remss[n + b + 1].push_back(x); } else { addss[n + a].push_back(x); remss[n + m].push_back(x); addss[n].push_back(x); remss[n + b + 1].push_back(x); } } } } } MinPQue que; que.push(INF); cost[k].assign(n + m, INF); for (int d = 0; d < n + m; ++d) { for (const int x : addss[d]) que.push(x); for (const int x : remss[d]) que.erase(x); cost[k][d] = que.top(); } costSuf[k] = cost[k]; for (int d = n; --d >= 0; ) { chmin(costSuf[k][d], costSuf[k][d + m]); } } /* cerr<<"ns = "<