Pagini recente » Cod sursa (job #1639658) | Cod sursa (job #2325519) | Cod sursa (job #1153076) | Cod sursa (job #2289208) | Cod sursa (job #9689)
Cod sursa(job #9689)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NMAX (1 << 20)
#define nd(a) (*(t_u *)(a))
typedef struct
{
int x, y;
}t_u;
int cmp(const void *a, const void *b);
long long go(int x);
int N, A, B, V[NMAX], seen[NMAX], ult[NMAX];
t_u U[NMAX];
int main()
{
int i, j;
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d%d%d", &N, &A, &B);
for(i = 0; i < N; i++)
{
scanf("%d", V + i);
U[i].x = V[i];
U[i].y = i;
}
qsort(U, N, sizeof(t_u), cmp);
for(i = 0, j = 0; i < N; i++)
{
if(i && U[i].x != U[i - 1].x) j = i;
V[U[i].y] = j;
}
/*int nr, k;
long long rez = 0;
for(i = 0; i < N; i++)
for(j = 0; j <= i; j++)
{
nr = 0;
for(k = j; k <= i; k++)
if(!seen[V[k]]) seen[V[k]] = 1, nr++;
if(nr >= A && nr <= B) rez++;
for(k = j; k <= i; k++)
seen[V[k]] = 0;
}
printf("%lld\n", rez);*/
printf("%lld\n", go(B) - go(A - 1));
return 0;
}
long long go(int x)
{
if(!x) return 0;
int i, j, nr;
long long rez = 0;
memset(seen, 0, sizeof(seen));
for(i = 0, j = 0, nr = 0; i < N; i++)
{
if(seen[V[i]] == 1) rez += (i - j + 1), ult[V[i]] = i;
else if(nr == x)
{
for(; j <= i && ult[V[j]] != j; j++);
seen[V[j]] = 0;
j++;
rez += (i - j + 1);
ult[V[i]] = i;
seen[V[i]] = 1;
}
else seen[V[i]] = 1, rez += (i - j + 1), ult[V[i]] = i, nr++;
}
return rez;
}
int cmp(const void *a, const void *b)
{
return nd(a).x - nd(b).x;
}