Cod sursa(job #17647)

Utilizator VmanDuta Vlad Vman Data 16 februarie 2007 15:49:16
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#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;
}