Cod sursa(job #1314450)

Utilizator MacWonkMihai Alexandru Cosmin MacWonk Data 11 ianuarie 2015 21:05:57
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 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;

}