#include #include #include using namespace std; #define INFL (2305843009213693951ll) template inline void chmin(T& a, const T& b) { if (a > b) a = b; } template struct SegmentTree { int _originSize, _size, _log2; vector _data; SegmentTree(int size) : SegmentTree(vector(size, e)) {} SegmentTree(const vector& vec) : _originSize(vec.size()), _size(1), _log2(1) { while (_originSize > 1 << _log2) { ++_log2; } _size <<= _log2; _data = vector(2 * _size, e); for (int i = 0; i < _originSize; ++i) { _data[i + _size] = vec[i]; } for (int i = _size - 1; i >= 1; --i) { _data[i] = op(_data[2 * i + 1], _data[2 * i]); } } void update(const int& index, const T value) { assert((uint)index < (uint)_size); int pos = index + _size; _data[pos] = value; for (int i = 1; i <= _log2; ++i) { int t = pos >> i; _data[t] = op(_data[2 * t + 1], _data[2 * t]); } } inline T get(const int& index) const { assert((uint)index < (uint)_size); return _data[index + _size]; } T query(const int& l, const int& r) const { assert(0 <= l && l <= r && r <= _size); int nl = l + _size; int nr = r + _size; T retl = e, retr = e; while (nl < nr) { if (nl & 1) { retl = op(retl, _data[nl]); ++nl; } if (nr & 1) { --nr; retr = op(retr, _data[nr]); } nl >>= 1; nr >>= 1; } return op(retl, retr); } }; long long min_op(long long a, long long b) { return min(a, b); } int main() { int n, m, k; cin >> n >> m >> k; vector c(n); vector a(m); for (int i = 0; i < n; ++i) { cin >> c[i]; } for (int i = 0; i < m; ++i) { cin >> a[i]; } assert(1 <= k && k <= 200000); assert(1 <= n && n <= 200000); assert(1 <= m && m <= 200000); for (int i = 0; i < n; ++i) { assert(1 <= c[i] && c[i] <= m); } for (int i = 0; i < m; ++i) { assert(1 <= a[i] && a[i] <= 1000000000); } for (int i = 0; i < n; ++i) { c[i] -= 1; } SegmentTree st(m); for (int color = 0; color < m; ++color) { st.update(color, a[color] * k); } for (int i = 0; i < k; ++i) { int color = c[i]; st.update(color, st.get(color) - a[color]); } long long ans = st.query(0, m); for (int i = k; i < n; ++i) { int rm_color = c[i - k]; int in_color = c[i]; st.update(rm_color, st.get(rm_color) + a[rm_color]); st.update(in_color, st.get(in_color) - a[in_color]); chmin(ans, st.query(0, m)); } cout << ans << endl; return 0; }