Cod sursa(job #50394)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 7 aprilie 2007 16:59:28
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#include <string>

using namespace std;

#define ui unsigned int 
#define ll long long
#define maxn 1048576
#define mod 5081
#define maxx 175
#define maxl 15

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

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

    p[v[aux]][aux]=x;
    c[v[aux]][aux]=1;
    v[aux]++;
    
    return 1;
}

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

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

int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    
    int i,j;
    
    scanf("%d %d %d ",&n,&x,&y);
	for (i=0;i<n;i++) 
    {
        fgets(s,maxl,stdin);
        for (j=0;s[j]!='\n';j++) a[i]=a[i]*10+s[j]-'0';
    }
    
	sol=count(x);
//	printf("%d\n",sol);
	
    memset(v,0,sizeof(v));

	sol=sol-count(y+1);
    
    printf("%lld\n",sol);
    
    return 0;
}