Cod sursa(job #13260)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 6 februarie 2007 00:50:52
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

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

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

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

    p[aux].push_back(x);
    c[aux].push_back(1);
    b[x]=v[aux];
    v[aux]++;
    
    return 1;
}

int extract(ui x)
{
    int aux=x%mod,i=0;
    
    while (x!=p[aux][i]) i++;
    
    if (c[aux][i]>1) 
    {
       c[aux][i]--;
       return 0;
    }
    else {
            v[aux]--;  
            c[aux][i]=c[aux][v[aux]];
            c[aux].pop_back();
            p[aux][i]=p[aux][v[aux]];
            p[aux].pop_back();
              
            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);
	
    memset(v,0,sizeof(v));

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