Cod sursa(job #1413530)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 1 aprilie 2015 22:12:24
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <vector>

#include <cstdio>
using namespace std;

const int MAX_N = (1 << 20) + 2;
const int MOD = 666013;

int N, L, U;
int freq[MAX_N], v[MAX_N];
vector < pair < unsigned, int > > H[MOD];

void insert_value(unsigned val, int newVal) {
    int L = val % MOD;

    H[L].push_back(make_pair(val, newVal));
}

int search_value(unsigned val) {
    int L = val % MOD;

    for(int i = 0; i < (int) H[L].size(); ++i) {
        if(H[L][i].first == val) {
            return H[L][i].second;
        }
    }
    return 0;
}

long long solve(int l) {
    long long ret = 0;

    for(int i = 1, j = 0, cnt = 0; i <= N; ++i) {
        while(j < N) {
            if(freq[v[j + 1]] == 0 && cnt == l) {
                break;
            }
            ++j;
            if(freq[v[j]] == 0) {
                ++cnt;
            }
            ++freq[v[j]];

            ret += j - i + 1;
        }

        --freq[v[i]];
        if(freq[v[i]] == 0) {
            --cnt;
        }
    }

    return ret;
}

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

    scanf("%d %d %d", &N, &L, &U);
    unsigned x;
    for(int i = 1, n = 0; i <= N; ++i) {
        scanf("%ud", &x);

        int tmp = search_value(x);
        if(!tmp) {
            ++n;
            tmp = n;
            insert_value(x, tmp);
        }

        v[i] = tmp;
    }

    printf("%lld\n", solve(U) - solve(L - 1));

    return 0;
}