Pagini recente » Cod sursa (job #403993) | Cod sursa (job #1150807) | Cod sursa (job #1407487) | Cod sursa (job #1624785) | Cod sursa (job #217954)
Cod sursa(job #217954)
#include <stdio.h>
#include <string.h>
unsigned long long n, l, u, v[1500000], nr, rez1, rez2, rez;
unsigned long long hash[2700000], viz[2700000];
unsigned long long hash_function(unsigned long long x)
{
unsigned long long y = x % 666013;
while (hash[y] && (hash[y] != x)) y++;
hash[y] = x;
return y;
}
unsigned long long caut(unsigned long long x)
{
unsigned long long xx = hash_function(x);
if (viz[xx]) return 1;
return 0;
}
void add(unsigned long long x)
{
unsigned long long poz = hash_function(x);
if (!caut(x))
{
viz[poz]++;
nr++;
}
else viz[poz]++;
}
void sterg(unsigned long long x)
{
unsigned long long poz = hash_function(x);
viz[poz]--;
if (!viz[poz]) nr--;
}
void citire()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
unsigned long long i, j;
char s[100];
scanf("%llu %llu %llu\n",&n,&l,&u);
for (i = 1; i <= n; i++)
{
scanf("%s",s);
j = 0;
while (s[j] <= '9' && s[j] >= '0') v[i] = v[i] * 10 + s[j++] - '0';
}
}
int main()
{
citire();
unsigned long long i, j;
j = 0;
for (i = 1; i <= n; i++)
{
add(v[i]);
if (nr >= l)
while (nr >= l)
{
j++;
sterg(v[j]);
}
rez1 += j;
}
nr = 0;
j = 0;
for (i = 1; i <= n; i++)
{
add(v[i]);
if (nr >= u + 1)
while (nr >= u + 1)
{
j++;
sterg(v[j]);
}
rez2 += j;
}
rez = rez1 - rez2;
printf("%llu\n",rez);
return 0;
}