Pagini recente » Cod sursa (job #1770472) | Cod sursa (job #944532) | Cod sursa (job #450102) | Cod sursa (job #2952681) | Cod sursa (job #59481)
Cod sursa(job #59481)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NMAX 1 << 20
#define Q 10003
#define nd(a) (*(int *)(a))
void read();
void solve();
int lcmp(const void *a, const void *b);
int N, L, U, A[NMAX], sol[NMAX], nr, X;
long long V[NMAX];
int *H[Q], nrv[Q];
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
read();
solve();
return 0;
}
void read()
{
scanf("%d%d%d", &N, &L, &U);
for(int i = 0; i < N; i++)
{
scanf("%lld", V + i);
nrv[V[i] % Q]++;
}
}
void solve()
{
int u = -1, i, j;
for(i = 0; i < Q; i++)
H[i] = new int[nrv[i] + 1], nrv[i] = 0;
for(i = 0; i < N; i++)
H[V[i] % Q][nrv[V[i] % Q]++] = i;
for(i = 0; i < Q; i++)
{
if(nrv[i])
qsort(H[i], nrv[i], sizeof(int), lcmp);
for(j = 0; j < nrv[i]; j++)
{
if(!j || V[H[i][j - 1]] != V[H[i][j]])
u++;
A[H[i][j]] = u;
}
}
/*memset(V, 0, sizeof(V));
long long rezz = 0;
for(i = 0; i < N; i++)
{
nr = 0;
memset(V, 0, sizeof(V));
for(j = i; j < N; j++)
{
if(V[A[j]] == 0) nr++;
V[A[j]]++;
if(nr >= L && nr <= U)
rezz++;
}
}
printf("%lld\n", rezz);*/
memset(V, 0, sizeof(V));
long long rez = 0;
nr = 0;
X = U;
rez++, V[A[0]]++, nr++;
for(i = 1, j = 0; i < N; i++)
{
nr = V[A[i]] == 0 ? nr + 1 : nr;
V[A[i]]++;
if(nr > X)
{
for(; j <= i && nr > X; j++)
{
nr = V[A[j]] == 1 ? nr - 1: nr;
V[A[j]]--;
}
}
rez += i - j + 1;
}
for(; j < N; j++)
V[A[j]]--;
nr = 0;
X = L - 1;
if(!X);
else
{
rez--, V[A[0]]++, nr++;
for(i = 1, j = 0; i < N; i++)
{
nr = V[A[i]] == 0 ? nr + 1 : nr;
V[A[i]]++;
for(; j <= i && nr > X; j++)
{
nr = V[A[j]] == 1 ? nr - 1: nr;
V[A[j]]--;
}
rez -= i - j + 1;
}
}
printf("%lld\n", rez);
}
int lcmp(const void *a, const void *b)
{
return V[nd(a)] - V[nd(b)];
}