Pagini recente » Cod sursa (job #1194549) | Cod sursa (job #2002170) | Monitorul de evaluare | Profil M@2Te4i | Cod sursa (job #9991)
Cod sursa(job #9991)
#include <stdio.h>
#include <string.h>
using namespace std;
#define NMAX (1 << 20)
#define LL long long
#define MOD 1399999
#define SZ 7
int N, L, U, MD;
unsigned int a[NMAX];
char pz[NMAX];
char nr[MOD];
unsigned int hash[SZ][MOD];
int nap[SZ][MOD];
int nap1[SZ][MOD];
void baga_hash(unsigned x, int poz)
{
int i;
for (i = 0; i < nr[MD]; i++)
if (hash[i][MD] == x) {
pz[poz] = i;
return;
}
pz[poz] = nr[MD];
hash[nr[MD]++][MD] = x;
}
#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\n", rand() % 400);
printf("\n");
fclose(stdout);
return 0;
}
int main()
{
// gen(1 << 20, 100, 10000);
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d\n", &N, &L, &U);
int i, j;
int lung = U, lung1 = L - 1;
int p, nr = 0, q, nr1 = 0;
LL rez = 0;
p = 0;
q = 0;
int aux, md;
char s[20];
for (i = 0; i < N; i++) {
fgets(s, 20, stdin);
for (j = 0; '0' <= s[j] && s[j] <= '9'; j++) a[i] = a[i] * 10 + s[j] - '0';
MD = a[i] % MOD;
baga_hash(a[i], i);
aux = ++nap[pz[i]][MD];
if (aux == 1) nr++;
aux = ++nap1[pz[i]][MD];
if (aux == 1) nr1++;
while (nr > lung) {
aux = --nap[pz[p]][a[p] % MOD];
if (!aux) nr--;
p++;
}
while (nr1 > lung1) {
aux = --nap1[pz[q]][a[q] % MOD];
if (!aux) nr1--;
q++;
}
rez += i - p + 1;
rez -= i - q + 1;
}
printf("%lld\n", rez);
fclose(stdin);
fclose(stdout);
return 0;
}