Cod sursa(job #15429)

Utilizator StTwisterKerekes Felix StTwister Data 11 februarie 2007 16:12:00
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <map>
#include <algorithm>

#define NMAX 1048577

using namespace std;

int A[NMAX], B[NMAX];
int N,L,U;
map< int, int> H;

int find(int nr_max)
{
    map<int, int> v;
    if (!nr_max)
        return 0;
    memset(B, 0, sizeof(B));
    
    B[1] = 1;
    v[A[1]] = 1;
    int nr = 1;
    for (int i = 2; i<=N; ++i)
    {
        if (!v[A[i]])
            ++nr;
        ++v[A[i]];
        int j = B[i-1];
        while (nr>nr_max)
        {
            --v[A[j]];
            if (!v[A[j]])
                --nr;
            ++j;
        }
        B[i] = j;
    }
    int S = 0;
    for (int i = 1; i<=N; ++i)
        S += (i-B[i]+1);
    return S;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    
    scanf("%d %d %d", &N, &L, &U);
    
    // normalizez
    int nr = 0;
    for (int i = 1; i<=N; ++i)
    {
        scanf("%d", A+i);
        if (!H[A[i]])
            H[A[i]] = ++nr;
        A[i] = nr;
    }
    
    printf("%d\n", find(U) - find(L-1));
}