Pagini recente » Cod sursa (job #2276158) | Cod sursa (job #3337880) | Cod sursa (job #1085154) | Cod sursa (job #3337632) | Cod sursa (job #3352563)
#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;
}