Cod sursa(job #3352563)

Utilizator mitoceanuci@gmail.comMitoceanu Ciprian [email protected] Data 28 aprilie 2026 20:03:49
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <vector>
#include <unordered_map>
#include <chrono>
#include <cstdio>

using namespace std;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

long long countAtMostK(const vector<uint32_t>& a, int k) {
    if (k <= 0) return 0;
    
    unordered_map<uint32_t, int, custom_hash> freq;
    freq.reserve(1024); 
    
    long long total_subarrays = 0;
    int left = 0;
    int distinct_count = 0;

    for (int right = 0; right < a.size(); ++right) {
        if (freq[a[right]] == 0) {
            distinct_count++;
        }
        freq[a[right]]++;

        while (distinct_count > k) {
            freq[a[left]]--;
            if (freq[a[left]] == 0) {
                distinct_count--;
            }
            left++;
        }
        
        total_subarrays += (right - left + 1);
    }
    
    return total_subarrays;
}

long long SubCont(const vector<uint32_t>& a, int l, int u) {
    return countAtMostK(a, u) - countAtMostK(a, l - 1);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, l, u;
    if (!(cin >> n >> l >> u)) return 0;

    vector<uint32_t> a;
    a.reserve(n); 

    for (int i = 0; i < n; i++) {
        uint32_t x;
        cin >> x;
        a.push_back(x);
    }

    cout << SubCont(a, l, u) << "\n";

    return 0;
}