Cod sursa(job #1437291)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 17 mai 2015 14:13:28
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <unordered_map>

#define Nmax 2000000

std::ifstream in("secv5.in");
std::ofstream out("secv5.out");

int A[Nmax], dp[Nmax];
std::unordered_map<int, int> MAP;

int main() {

    int N, L, U;
    in >> N >> L >> U;

    for (int i = 1; i <= N; i++)
        in >> A[i];

    int left = 1, right = 1, cnt = 0, total = 0;
    while (1) {

        if (MAP.find(A[right]) == MAP.end()) {
            MAP[A[right]] = 1;
            cnt++;
        } else MAP[A[right]]++;

        while (cnt > U) {
            MAP[A[left]]--;

            if (MAP[A[left]] == 0) {
                MAP.erase(A[left]);
                cnt--;

                left++;
                dp[left] = dp[left - 1] - 1;
            } else {
                left++;
                dp[left] = dp[left - 1];
            }
        }

        if (cnt >= L)
            dp[left]++;

        right++;
        if (right == N + 1) break;
    }

    while (1) {

        MAP[A[left]]--;

        if (MAP[A[left]] == 0) {
            MAP.erase(A[left]);
            cnt--;

            if (cnt < L) break;

            left++;
            dp[left] = dp[left - 1] - 1;
        } else {
            left++;
            dp[left] = dp[left - 1];
        }
    }

    for (int i = 1; i <= N; i++)
        total += dp[i];

    out << total << "\n";
}