Pagini recente » Cod sursa (job #1523923) | Cod sursa (job #1996506) | Cod sursa (job #351399) | Cod sursa (job #1735968) | Cod sursa (job #2881351)
#include <iostream>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int NMAX = (1 << 20);
int n, l, u;
int v[NMAX + 5];
unordered_map<int, int> aparitii;
long long count_subsecv(int max_ap) {
for(int i = 1; i <= n; i++)
aparitii[ v[i] ] = 0;
long long nr_secv = 0;
int st = 1, dr = 0;
int nr_distincte = 0; // cate nr distincte am in secventa curenta
while(st <= n) {
// Verific daca pot extinde
if(dr < n && (st > dr || nr_distincte <= max_ap)) {
aparitii[ v[++dr] ]++;
if(aparitii[ v[dr] ] == 1)
nr_distincte++;
}
else {
aparitii[ v[st] ]--;
if(aparitii[ v[st] ] == 0)
nr_distincte--;
st++;
}
// Verific daca secventa curenta e buna
if(st <= dr && nr_distincte <= max_ap) {
nr_secv += (dr - st + 1);
if(dr == n)
break;
}
}
return nr_secv;
}
int main() {
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &n, &l, &u);
for(int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
aparitii[ v[i] ] = 0;
}
printf("%lld", count_subsecv(u) - count_subsecv(l - 1));
return 0;
}