Cod sursa(job #3350044)

Utilizator iLaurianLaurian Iacob iLaurian Data 4 aprilie 2026 23:56:57
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#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;
}