Cod sursa(job #292881)

Utilizator crawlerPuni Andrei Paul crawler Data 31 martie 2009 19:23:26
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>

#define Mod 1234561
#define Nmax 1100100

unsigned h[Mod+Nmax], cnt=Mod, COD;
unsigned t[Mod+Nmax];
unsigned w[Mod+Nmax];
unsigned a[Nmax];
unsigned f[Nmax],n,l,u;

unsigned atou(char *x)
{
     unsigned ret = 0;
     while (*x != '\n')
          ret = ret*10 + *x - '0',
          ++x;;
     return ret;     
}

long long fct(unsigned k)
{
     unsigned p = 1;
     unsigned nr = 0;
     long long ret = 0;

     for (unsigned i=1;i<=COD;++i)
          f[i]=0;

     for (unsigned i=1;i<=n;++i)     
     {
          ++f[a[i]];
          if (f[a[i]] == 1)
               ++nr;
          
          while (nr > k)
          {
               --f[a[p]];
               if (f[a[p]] == 0)
                    --nr;     
               ++p;                         
          }     
          ret += i-p+1;     
     }
     return ret;
}

int main()
{
     freopen("secv5.in","r",stdin);
     freopen("secv5.out","w",stdout);
     
     scanf("%d%d%d\n", &n,&l,&u);
     --l;
     
     char buff[32];
     unsigned p;
     
     for (unsigned i=1;i<=n;++i)
     {
          fgets(buff,32,stdin);
          a[i] = atou(buff);
          p = a[i]%Mod;
          while (h[p] != a[i] && t[p] != 0)
               p = t[p];
          if (h[p] == a[i])
               a[i] = w[p];
          else
               {
                    t[p] = ++cnt;
                    p = cnt;
                    h[p] = a[i];
                    w[p] = ++COD;
                    a[i] = w[p];     
               }
     }
     
     printf("%lld\n", fct(u)-fct(l));
     
     return 0;     
}