Cod sursa(job #2877060)

Utilizator dimi999Dimitriu Andrei dimi999 Data 24 martie 2022 09:06:41
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <vector>
#include <map>
using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

vector <unsigned int> v;
map <unsigned int, unsigned int> fvst, fvdr;

int main() {
    unsigned int N, L, U;

    fin >> N >> L >> U;

    for(unsigned int i = 1; i <= N; i++) {
        unsigned int x; fin >> x; v.push_back(x);
    }
    unsigned int poz = 0, st = 0, dr = 0;

    while(fvst.size() < L && poz < N) {
        fvst[v[poz]]++;
        fvdr[v[poz]]++;
        poz++;
    }

    if(poz == N) {
        if(fvst.size() < L) {
            fout << 0 << '\n';
            return 0;
        }
    }

    st = poz - 1;

    while(fvdr.size() <= U && poz < N) {
        fvdr[v[poz]]++;
        poz++;
    }

    if(fvdr.size() <= U)
        dr = poz - 1;
    else
        dr = poz - 2;

    long long ans = dr - st + 1;

    poz = 1;
    while(poz < N) {
        fvst[v[poz - 1]]--;
        fvdr[v[poz - 1]]--;

        if(fvst[v[poz - 1]] == 0) {
            fvst.erase(v[poz - 1]);
        }

        if(fvdr[v[poz - 1]] == 0) {
            fvdr.erase(v[poz - 1]);
        }

        while(fvst.size() < L && st < N - 1) {
            fvst[v[st + 1]]++;
            st++;
        }

        if(st == N - 1 && fvst.size() < L)
            break;

        while(fvdr.size() <= U && dr < N - 1) {
            fvdr[v[++dr]]++;
        }
        if(fvdr.size() > U)
            dr--;

        ans += dr - st + 1;
        poz++;
    }

    fout << ans;
    return 0;
}