Pagini recente » Cod sursa (job #519860) | Cod sursa (job #1839038) | Cod sursa (job #2039234) | Cod sursa (job #3206550) | Cod sursa (job #1413531)
#include <vector>
#include <cstdio>
using namespace std;
const int MAX_N = (1 << 20) + 2;
const int MOD = 666013;
int N, L, U, n;
int freq[MAX_N], v[MAX_N];
vector < pair < unsigned, int > > H[MOD];
void insert_value(unsigned val, int newVal) {
int L = val % MOD;
H[L].push_back(make_pair(val, newVal));
}
int search_value(unsigned val) {
int L = val % MOD;
for(int i = 0; i < (int) H[L].size(); ++i) {
if(H[L][i].first == val) {
return H[L][i].second;
}
}
return 0;
}
long long solve(int l) {
long long ret = 0;
for(int i = 1; i <= n; ++i) {
freq[i] = 0;
}
for(int i = 1, j = 0, cnt = 0; i <= N; ++i) {
while(j < N) {
if(freq[v[j + 1]] == 0 && cnt == l) {
break;
}
++j;
if(freq[v[j]] == 0) {
++cnt;
}
++freq[v[j]];
ret += j - i + 1;
}
--freq[v[i]];
if(freq[v[i]] == 0) {
--cnt;
}
}
return ret;
}
int main() {
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &N, &L, &U);
unsigned x;
for(int i = 1; i <= N; ++i) {
scanf("%ud", &x);
int tmp = search_value(x);
if(!tmp) {
++n;
tmp = n;
insert_value(x, tmp);
}
v[i] = tmp;
}
printf("%lld\n", solve(U) - solve(L - 1));
return 0;
}