Pagini recente » Cod sursa (job #3263144) | Cod sursa (job #2188190) | Cod sursa (job #3347734) | Cod sursa (job #3301561) | Cod sursa (job #3351027)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main(){
ifstream fin("secv5.in");
ofstream fout("secv5.out");
long long nums[1<<20];
long long N, L, U, l, r, count1 = 0, count2 = 0;
unordered_map<long long, unsigned int> map;
fin>>N>>L>>U;
for(unsigned int i=0; i < N; i++)
fin>>nums[i];
// two pointers to find all subarrays with maximum L distinct elements
l = r = 0;
while(r < N){
map[nums[r]]++;
while(map.size() > L-1){
map[nums[l]]--;
if(map[nums[l]] == 0)
map.erase(nums[l]);
l++;
}
count1 += r - l + 1;
r++;
}
map.clear();
// two pointers to find all subarrays with maximum U distinct elements
l = r = 0;
while(r < N){
map[nums[r]]++;
while(map.size() > U){
map[nums[l]]--;
if(map[nums[l]] == 0)
map.erase(nums[l]);
l++;
}
count2 += r - l + 1;
r++;
}
// func(<=U) - func(<=L) = func(>=L && <=U), where "-" is set difference, with func(<=U) and func(<=L) sets.
fout<<count2 - count1;
return 0;
}