Pagini recente » Cod sursa (job #1240267) | Cod sursa (job #3312584) | Cod sursa (job #630900) | Diferente pentru reguli intre reviziile 8 si 21 | Cod sursa (job #3350042)
#include <algorithm>
#include <fstream>
#include <vector>
std::ifstream f ("secv5.in");
std::ofstream g ("secv5.out");
int n, l, u, answer;
int fr[1050000];
int main() {
f >> n >> l >> u;
std::vector<int> v;
for (int i = 0; i < n; i++) {
int x; f >> x;
v.push_back(x);
}
std::vector<int> aux = v;
std::ranges::sort(aux);
aux.erase(std::ranges::unique(aux).begin(), aux.end());
for (int i = 0; i < n; i++) {
v[i] = static_cast<int>(std::ranges::lower_bound(aux, v[i]) - aux.begin());
}
int left = 0, right = 0, distinct = 0;
while (left < n - l + 1) {
if (fr[v[right]] == 0) {
distinct++;
}
fr[v[right]]++;
if (distinct >= l && distinct <= u) {
answer++;
}
if (distinct > u) {
while (distinct > u) {
fr[v[left]]--;
if (fr[v[left]] == 0) {
distinct--;
}
left++;
}
right = left;
}
right++;
if (right == n) {
left++;
right = left;
distinct = 0;
std::fill_n(fr, 1050000, 0);
}
}
g << answer << "\n";
return 0;
}