Pagini recente » Cod sursa (job #3259344) | Cod sursa (job #1497379) | Cod sursa (job #1465321) | Cod sursa (job #2842991) | Cod sursa (job #2951738)
#include <stdio.h>
#include <string.h>
#define NMAX (1 << 20) + 1
#define modulo 666013
FILE *f = fopen("secv5.in", "rt"), *g = fopen("secv5.out", "wt");
struct hash
{
unsigned long int x, nr;
hash *urm;
} *vf[modulo];
unsigned long int a[NMAX], n, i, j, k, v[NMAX], min1, max1;
unsigned long int L[NMAX];
void citire()
{
unsigned long int nr = 1, x, ok, l;
hash *p;
fscanf(f, "%lu %lu %lu\n", &n, &min1, &max1);
char s[102];
for (i = 1; i <= n; i++)
{
fgets(s, 100, f);
k = 0;
for (j = 0; s[j] != ' ' && s[j] != '\n'; j++)
k = k * 10 + (unsigned long int)s[j];
x = k % modulo;
ok = 0;
p = vf[x];
while (p)
{
if (p->x == k)
{
ok = p->nr;
break;
}
p = p->urm;
}
if (ok)
a[i] = ok;
else
{
a[i] = nr++;
p = new hash;
p->nr = nr - 1;
p->x = k;
p->urm = vf[x];
vf[x] = p;
}
}
}
long long calcul(unsigned long int x)
{
unsigned long int start = 1, final = 0, nr = 0;
for (i = 1; i <= n; i++)
{
v[i] = 0;
L[i] = 0;
}
while (final <= n)
{
final++;
v[a[final]]++;
if (v[a[final]] == 1)
nr++;
while (nr > x)
{
start++;
v[a[start - 1]]--;
if (v[a[start - 1]] == 0)
nr--;
}
L[final] = start;
}
long long sol = 0;
for (i = 1; i <= n; i++)
sol = sol + (long long)(i - L[i] + 1);
return sol;
}
int main()
{
citire();
long long s1, s2;
s1 = calcul(min1 - 1);
s2 = calcul(max1);
fprintf(g, "%lld\n", s2 - s1);
fclose(f);
fclose(g);
return 0;
}