Pagini recente » Borderou de evaluare (job #2019951) | Cod sursa (job #231886) | Cod sursa (job #3004825) | Cod sursa (job #2976470) | Cod sursa (job #1437291)
#include <iostream>
#include <fstream>
#include <unordered_map>
#define Nmax 2000000
std::ifstream in("secv5.in");
std::ofstream out("secv5.out");
int A[Nmax], dp[Nmax];
std::unordered_map<int, int> MAP;
int main() {
int N, L, U;
in >> N >> L >> U;
for (int i = 1; i <= N; i++)
in >> A[i];
int left = 1, right = 1, cnt = 0, total = 0;
while (1) {
if (MAP.find(A[right]) == MAP.end()) {
MAP[A[right]] = 1;
cnt++;
} else MAP[A[right]]++;
while (cnt > U) {
MAP[A[left]]--;
if (MAP[A[left]] == 0) {
MAP.erase(A[left]);
cnt--;
left++;
dp[left] = dp[left - 1] - 1;
} else {
left++;
dp[left] = dp[left - 1];
}
}
if (cnt >= L)
dp[left]++;
right++;
if (right == N + 1) break;
}
while (1) {
MAP[A[left]]--;
if (MAP[A[left]] == 0) {
MAP.erase(A[left]);
cnt--;
if (cnt < L) break;
left++;
dp[left] = dp[left - 1] - 1;
} else {
left++;
dp[left] = dp[left - 1];
}
}
for (int i = 1; i <= N; i++)
total += dp[i];
out << total << "\n";
}