Cod sursa(job #13029)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 5 februarie 2007 14:32:50
Problema Secventa 5 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <string.h>

#define ui unsigned int 
#define ll long long
#define maxn 1048576
#define mod 666013
#define maxl 10

int n,x,y;
ui a[maxn];
ll sol;
int c[mod][maxl],v[mod];
ui p[mod][maxl];

int add(ui x)
{
    int aux=x%mod,i=0;
    
    while ((i<v[aux]) && (p[aux][i]!=0))
    {
          if (p[aux][i]==x) 
          {
              c[aux][i]++; 
              return 0;
          }
          i++;
    }
    
    v[aux]++;
    p[aux][i]=x;
    c[aux][i]=1;
    return 1;
}

int extract(ui x)
{
    int aux=x%mod,i=0;
    
    while (p[aux][i]!=x) i++;
    
    if (c[aux][i]>1) 
    {
       c[aux][i]--;
       return 0;
    }
    else {
            c[aux][i]=c[aux][v[aux]];
            p[aux][i]=p[aux][v[aux]];
            v[aux]--;  
            return 1;
         }
}

ll count(int x)
{
     int i,j=0,diff=0;
     ll rez=0;
     
     memset(c,0,sizeof(c));
     memset(p,0,sizeof(p));
     memset(v,0,sizeof(v));
     
     for (i=0;i<n;i++)
     {
         diff+=add(a[i]);
		 while ((diff>=x) && (j<n))
         {
               diff-=extract(a[j]);
               j++;
         }
         rez+=j;
     }
     
     return rez;
}

int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    
    int i;
    
    scanf("%d %d %d",&n,&x,&y);
	for (i=0;i<n;i++) scanf("%lu",&a[i]);
    
	sol=count(x);
//	printf("%lld\n",sol);
	sol=sol-count(y+1);
    
    printf("%lld\n",sol);
    
    return 0;
}