Cod sursa(job #1314143)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 11 ianuarie 2015 16:25:21
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

#define maxn 1050000
#define mod 9319


int n ;
int L, U ;
vector <int> kush[mod] ;
vector <int> place[mod] ;
int indice ;
unsigned int ind[maxn] ;
int nr[maxn] ;
char sir[64] ;

int find_value(unsigned int x)
{

    int list=x%mod ;
    int len=kush[list].size();

    for(int i=0; i<len; ++i)
    if(kush[list][i]==x) return place[list][i];

    return -1 ;
}

void insert_value(unsigned int x, int poz)
{

    int ok=find_value(x);

    if(ok==-1)
    {
        int list=x%mod;
        kush[list].push_back(x);
        place[list].push_back(indice);
        ind[poz]=indice;
        ++indice;
    }

    else ind[poz]=ok ;
}

long long numar(int nrmax)
{

    long long nrdif=0;
    long long st=-1;
    long long sol=0;

    for(int i=0; i<n; ++i)
    {

        if(!nr[ind[i]]) ++nrdif;

        ++nr[ind[i]];

        while(st<i && nrdif>nrmax )
        {
            ++st;
            --nr[ind[st]];
            if(!nr[ind[st]]) --nrdif ;
        }

        sol+=i-st;
    }

    return sol;
}

int main()
{

    freopen("secv5.in", "rt", stdin);
    freopen("secv5.out", "wt", stdout);

    scanf("%d%d%d", &n, &L, &U);

    for(int i=0; i<n; ++i)
    {

        scanf("%s", sir);
        unsigned int x=0;

        for(int j=0 ; sir[j]>='0' && sir[j]<='9'; ++j)
        x=x*10+(sir[j]-'0');


        insert_value(x, i);

    }

    long long sol1 = numar(U);

    memset(nr, 0, sizeof(nr));

    long long sol2=numar(L-1);

    long long sol=sol1-sol2;

    printf("%lld\n", sol);

    return 0;

}