#include using namespace std; using ll = long long; class SegmentTree { static const int id = 1e9; const int n; vector data; int size(int n) { int res = 1; while (res < n) res <<= 1; return res; } public: SegmentTree(int n_) : n(size(n_)), data(n * 2, id) {} void Init(const vector& data_) { for (int i = 0; i < (int)data_.size(); i++) data[i + n] = data_[i]; for (int i = n - 1; i >= 0; i--) data[i] = min(data[i * 2], data[i * 2 + 1]); } int Find(int l, int r) { l += n; r += n; int res1 = id, res2 = id; while (l < r) { if (l & 1) res1 = min(res1, data[l++]); if (r & 1) res2 = min(data[--r], res2); l >>= 1; r >>= 1; } return min(res1, res2); } }; vector LCP(const vector& Ss) { int N = Ss.size(); vector res(N); for (int i = 1; i < N; i++) { auto& S = Ss[i - 1]; auto& T = Ss[i]; int j = 0, ss = S.size(), ts = T.size(); while (j < ss && j < ts && S[j] == T[j]) { j++; } res[i - 1] = j; } return res; } int main() { cin.sync_with_stdio(false); ll N, M; ll x, d; cin >> N; vector> s(N); for (int i = 0; i < N; i++) { cin >> s[i].first; s[i].second = i; } sort(s.begin(), s.end()); vector b(N); vector trans(N); for (int i = 0; i < N; i++) { b[i] = s[i].first; trans[s[i].second] = i; } SegmentTree rmq(N); auto lcp = LCP(b); rmq.Init(lcp); cin >> M >> x >> d; ll res = 0; for (int i = 0; i < M; i++) { ll l = x / (N - 1), r = x % (N - 1); if (l > r) { swap(l, r); } else { r++; } x = (x + d) % (N * (N - 1)); l = trans[l]; r = trans[r]; if (l > r) swap(l, r); res += rmq.Find(l, r); } cout << res << endl; return 0; }