Pagini recente » Cod sursa (job #2537861) | Cod sursa (job #377348) | Cod sursa (job #1592396) | Cod sursa (job #3145938) | Cod sursa (job #17647)
Cod sursa(job #17647)
#include <stdio.h>
#include <math.h>
#define dim_hash 100000
#define nmax 1048576
#define golden (sqrt(5)-1)/2
long n,l,u,aparitii[nmax],i,j,ind[nmax],x[nmax],key,distincte,hash[dim_hash][24];
long total1,total2;
int nou;
double frac;
long secvente(long m)
{
long j=1;
long nr=0;
unsigned long total=0;
for (i=1;i<=n;++i)
{
if (aparitii[ind[i]]==0) ++nr;
++aparitii[ind[i]];
while (nr>m)
{
if (aparitii[ind[j]]==1) --nr;
--aparitii[ind[j]];
++j;
}
total += i-j+1;
}
return total;
}
int main()
{
freopen("secv5.in","r",stdin);
scanf("%ld %ld %ld\n",&n,&l,&u);
for (i=1;i<=n;++i)
{
scanf("%ld\n",&x[i]);
frac=(x[i]*golden)-floor(x[i]*golden);
key = floor( frac * dim_hash );
nou=0;
for (j=1;j<=hash[key][0];++j)
if (x[i]==x[hash[key][j]]) {
nou=hash[key][j];
break;
}
if (nou==0)
{
hash[key][++hash[key][0]] = i;
++distincte;
ind[i] = distincte;
}
else ind[i]=ind[nou];
}
fclose(stdin);
total1 = secvente(l-1);
total2 = secvente(u);
freopen("secv5.out","w",stdout);
printf("%ld",total2-total1);
fclose(stdout);
return 0;
}