Cod sursa(job #50363)

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

using namespace std;

#define mod 42013
#define mod2 666013
#define maxn 1048576
#define maxl 13
#define ui unsigned int
#define ll long long 
#define us unsigned short
#define pb push_back
#define pp pop_back

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

void add(ui x)
{
     int y=x%mod,z=x%mod2,i;
     
     for (i=0;i<v[y];i++)
       if (p[y][i]==z) 
       {
            c[y][i]++;
            return;
       }
       
     c[y].pb(1);
     p[y].pb(z);
     v[y]++;
     dif++;
}

void del(ui x)
{
     int y=x%mod,z=x%mod2,i;

     for (i=0;i<v[y];i++)
       if (p[y][i]==z)
       {
           if (c[y][i]==1)
           {
               c[y][i]=c[y][v[y]-1];
               p[y][i]=p[y][v[y]-1];
               dif--;
               v[y]--;
               c[y].pp();
               p[y].pp();
           }
           else c[y][i]--;
           break;
       }
}

ll count(int x)
{
     int i,j=0;
     ll rez=0;
     dif=0;
     
     for (i=0;i<n;i++)
     {
         add(a[i]);
         while (dif>x) del(a[j++]);
         rez+=i-j+1;
     }  
     
     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(y);
    for (i=0;i<mod;++i) 
    {
        c[i].clear();
        p[i].clear();
    }
    memset(v,0,sizeof(v));
    
    sol-=count(x-1);
    
    printf("%lld\n",sol);
    
    return 0;
}