Pagini recente » Cod sursa (job #1046911) | Cod sursa (job #1083497) | Cod sursa (job #2073853) | Cod sursa (job #902631) | Cod sursa (job #3350044)
#include <algorithm>
#include <fstream>
#include <vector>
std::ifstream f ("secv5.in");
std::ofstream g ("secv5.out");
int n, l, u, answer;
long long countAtMostK(const int k, const std::vector<int>& v, int distinct_elements) {
if (k == 0) return 0;
long long count = 0;
int left = 0;
int distinct = 0;
std::vector<int> fr(distinct_elements, 0);
for (unsigned int right = 0; right < v.size(); right++) {
if (fr[v[right]] == 0) {
distinct++;
}
fr[v[right]]++;
while (distinct > k) {
fr[v[left]]--;
if (fr[v[left]] == 0) {
distinct--;
}
left++;
}
count += (right - left + 1);
}
return count;
}
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());
}
g << countAtMostK(u, v, aux.size()) - countAtMostK(l - 1, v, aux.size()) << "\n";
return 0;
}