#include using namespace std; using ll = long long; ll N, M, K, X; vector orgs; // Funkce na ošetření cykličnosti ll get_org_pos(int i) { return orgs[i % M] + N * (i / M); } signed main() { cin >> N >> M >> K >> X; orgs.resize(M); for (int i = 0; i < M; i++) { cin >> orgs[i]; orgs[i]--; } sort(orgs.begin(), orgs.end()); // Počáteční umístění kontrolovaného intervalu int startAfterOrg=0, endBeforeOrg=1; ll startPos = orgs[0] + 1; ll count = 0, possible = 0; while (endBeforeOrg < M && get_org_pos(endBeforeOrg) < startPos + K) { count++, endBeforeOrg++; } // Postupně posouváme, dokud nedojdeme zase na začátek while (startAfterOrg < M) { ll distStart = get_org_pos(startAfterOrg + 1) + 1 - startPos; ll distEnd = get_org_pos(endBeforeOrg) - (startPos + K - 1); ll moved = 0, changeCount = 0; if (distStart < distEnd) { // Dřív nám organizátor interval opustí moved = distStart; changeCount = -1; startAfterOrg++; } else if (distStart > distEnd) { // Dřív nám organizátor do interval přibyde moved = distEnd; changeCount = 1; endBeforeOrg++; } else { // Nastne obojí současně moved = distStart; startAfterOrg++, endBeforeOrg++; } if (count == X) { // Organizátorů byl hledaný počet possible += moved; } count += changeCount; startPos += moved; } cout << possible << endl; }