Pagini recente » Cod sursa (job #2402109) | Cod sursa (job #567326) | Cod sursa (job #1411753) | Cod sursa (job #2182014) | Cod sursa (job #9921)
Cod sursa(job #9921)
#include <stdio.h>
#include <string.h>
using namespace std;
#define NMAX (1 << 20)
#define LL long long
#define MOD 666013
int N, L, U;
unsigned int a[NMAX];
unsigned int b[NMAX];
int md[NMAX];
short nr[MOD];
unsigned int hash[MOD][5];
int nap[MOD][5];
inline int get(unsigned int x, int poz, int add)
{
int q = md[poz];
int i;
for (i = 0; i < nr[q]; i++)
if (hash[q][i] == x) return nap[q][i] += add;
hash[q][nr[q]++] = x;
return nap[q][nr[q] - 1] += add;
}
LL baga(int lung)
{
int i, p, nr = 0;
LL rez = 0;
p = 0;
int aux;
for (i = 0; i < N; i++) {
aux = get(a[i], i, 1);
if (aux == 1) nr++;
while (nr > lung) {
aux = get(b[p], p, -1);
if (!aux) nr--;
p++;
}
rez += i - p + 1;
}
return rez;
}
#include <stdlib.h>
int gen(int N, int L, int U)
{
freopen("secv5.in", "w", stdout);
printf("%d %d %d\n", N, L, U);
int i;
for (i = 1; i <= N; i++) printf("%d ", rand() % 400);
printf("\n");
fclose(stdout);
return 0;
}
int main()
{
// gen(1 << 20, 100, 10000);
int i;
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &N, &L, &U);
for (i = 0; i < N; i++) {
scanf("%u", &a[i]);
md[i] = a[i] % MOD;
get(a[i], i, 0);
b[i] = a[i];
}
LL rez1 = baga(U);
memset(nap, 0, sizeof(nap));
LL rez2 = baga(L - 1);
printf("%lld\n", rez1 - rez2);
fclose(stdin);
fclose(stdout);
return 0;
}