Cod sursa(job #2877076)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 24 martie 2022 09:18:26
Problema Secventa 5 Scor 80
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.48 kb
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")

#include <fstream>
#include <unordered_map>

using namespace std;

const int NMAX = 1 << 20;

ifstream cin("secv5.in");
ofstream cout("secv5.out");

int N, L, U;
unsigned int v[NMAX + 2];
int l1 = 1, r1, l2 = 1, r2;
unsigned int d1[NMAX + 2], d2[NMAX + 2];
unordered_map<unsigned int, int> vf1, vf2;
int count1, count2;

int main() {
    cin >> N >> L >> U;
    for (int i = 1; i <= N; ++i) {
        cin >> v[i];
    }

    long long sol = 0;

    for (int i = 1; i <= N; ++i) {
        if (vf1[v[i]] == 0) {
            count1++;
        }
        vf1[v[i]]++;
        d1[++r1] = i;

        if (vf2[v[i]] == 0) {
            count2++;
        }
        vf2[v[i]]++;
        d2[++r2] = i;

        while (count1 > U) {
            if (vf1[v[d1[l1]]] == 1) {
                count1--;
            }
            vf1[v[d1[l1]]]--;
            l1++;
        }

        int last = -1;
        while (count2 >= L) {
            last = d2[l2];
            if (vf2[v[d2[l2]]] == 1) {
                count2--;
            }
            vf2[v[d2[l2]]]--;
            l2++;
        }

        if (last != -1) {
            if (vf2[v[last]] == 0) {
                count2++;
            }
            vf2[v[last]]++;
            d2[--l2] = last;
        }

        if (count2 >= L) {
            sol += (d2[l2] - d1[l1] + 1);
        }
    }
    cout << sol << '\n';

    return 0;
}