Cod sursa(job #383282)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 16 ianuarie 2010 11:37:54
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;

#define MOD 666013

int n,u,l,nr,f[1<<20],indx;
unsigned int v[1<<20];

vector< pair<unsigned int,int> > hash[MOD];

int find(unsigned int x)
{
    int key=x%MOD,sz=hash[key].size(),i;
    for (i=0;i<sz;i++)
        if (hash[key][i].first==x)
            return hash[key][i].second;
    return -1;
}

void add(int x)
{
    if (find(x) == -1)
    {
        hash[x%MOD].push_back(make_pair(x,indx));
        indx++;
    }
}

ll spsecv(int lim)
{
    int nrdif=0,i;
    int st=-1;
    ll sol=0;
    for(i=0;i<n;i++)
    {
        if(!f[v[i]])
            nrdif++;
        f[v[i]]++;
        while(st<i && nrdif>lim)
        {
            st++;
            f[v[st]]--;
            if(!f[v[st]])
                nrdif--;                
        }
        sol+=i-st;
    }
    return sol;
}

char s[16];
int main ()
{
    int i,j,len,st,dr,m=0,nrel=0,ult;
    ll r1,r2,r;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d\n",&n,&l,&u);
    for(i=0;i<n;i++)
    {
        fgets(s,sizeof(s),stdin);
        int len=strlen(s);
        for (j=0,len=strlen(s);j<len;j++)
            if (s[j]>='0' && s[j]<='9')
                v[i]=v[i]*10+s[j]-'0';
            else
                break;
        add(v[i]);
    }
    
    for (i=0;i<n;i++)
        v[i]=find(v[i]);
    
    r1=spsecv(u);
    for(i=0;i<indx;i++)
        f[i]=0;
    r2=spsecv(l-1);
    r=r1-r2;
    printf("%lld\n",r);
    return 0;
}