Cod sursa(job #906280)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 6 martie 2013 18:16:44
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<cstdio>
#include<cstring>
#include<vector>
#define M 224737
#define NMax (1<<20)+5
using namespace std;

typedef vector<pair<unsigned,int> >::iterator IT;
unsigned v[NMax];
int n,l,u;
vector<pair<unsigned,int> > a[M];
IT poz[NMax];

inline vector<pair<unsigned,int> >::iterator find (unsigned x)
{
    IT it;
    for (it=a[v[x]%M].begin(); it!=a[v[x]%M].end(); ++it)
        if (it->first==v[x])
            return it;
    return a[v[x]%M].end();
}

inline vector<pair<unsigned,int> >::iterator check (unsigned x)
{
    IT it=poz[x];
    if (v[x]==it->first)
        return it;
    return find(x);
}

void hash ()
{
    for (int i=1; i<=n; i++)
    {
        IT it;
        it=find(i);
        if (it==a[v[i]%M].end())
        {
            a[v[i]%M].push_back(make_pair(v[i],0));
            it=find(i);
        }
        poz[i]=it;
    }
}

void reset (int x)
{
    IT it;
    int i;
    for (i=x; i<=n; i++)
    {
        it=check(i);
        it->second=0;
    }
}

long long sol (int x)
{
    IT it;
    if (!x) return 0;
    int nr=1,st=1,i;
    long long sum=1,aux;
    it=check(1);
    it->second=1;
    for (i=2; i<=n; i++)
    {
        it=check(i);
        if (it->second==0)
            nr++;
        it->second++;
        while (nr>x)
        {
            it=check(st);
            if (it->second==1)
                nr--;
            it->second--;
            st++;
        }
        aux=(long long)(i-st+1);
        sum+=aux;
    }
    if (x==u) reset(st);
    return sum;
}

int main ()
{
    char s[10];
    int i,lg,j;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for (i=1; i<=n; i++)
    {
        scanf("%s",s);
        lg=strlen(s);
        for (j=0; j<lg; j++)
            v[i]=v[i]*10+(s[j]-'0');
    }
    hash();
    printf("%lld\n",sol(u)-sol(l-1));
    return 0;
}