Cod sursa(job #292865)

Utilizator crawlerPuni Andrei Paul crawler Data 31 martie 2009 18:58:10
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda qwerty-8 Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>

#define Mod 1234561
#define Nmax 1100100

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

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

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

     for (int 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;     
     }
     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];
     int p;
     
     for (int i=1;i<=n;++i)
     {
          fgets(buff,32,stdin);
          a[i] = atoi(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;     
}