Cod sursa(job #1209207)

Utilizator ZenusTudor Costin Razvan Zenus Data 17 iulie 2014 12:31:48
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MOD 10003
#define NMAX (1<<21)
#define UI unsigned int
#define PUII pair < unsigned int , int >
#define LL long long

UI where[NMAX],D[NMAX];
UI X,N,left,right,i,j,position,puse;
vector <PUII> H[MOD];

LL calcul(UI limita)
{
    UI last=0,diferite=0,i;
    LL sol=0;

    for (i=1;i<=N;++i)
    {
        while(true)
        {
            ++last;

            ++D[where[last]];

            if (D[where[last]]==1)
            ++diferite;

            if (diferite>limita || last>N)
            break;
        }

        --D[where[last]];

        if (!D[where[last]])
        --diferite;

        --last;
        sol+=1LL*(last-i+1);
        --D[where[i]];

        if (!D[where[i]])
        --diferite;
    }

    return sol;
}

int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);

scanf("%u%u%u",&N,&left,&right);

//NORMALIZARE
for (i=1;i<=N;i++)
{
    scanf("%u",&X);
    position=0;

    for (j=0;j<H[X%MOD].size();++j)
    if (H[X%MOD][j].first==X)
    position=H[X%MOD][j].second;

    if (!position)
    {
        ++puse;
        position=puse;

        H[X%MOD].push_back(make_pair(X,puse));
    }
    where[i]=position;
}

printf("%lld",calcul(right)-calcul(left-1));

return 0;
}