Cod sursa(job #3355866)

Utilizator PedroLuisNegoita Luis PedroLuis Data 27 mai 2026 01:17:01
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int s(const vector<int>& unice, int x) {
    int st = 0;
    int dr = (int)unice.size() - 1;
    while (st <= dr) {
        int mij = st + (dr - st) / 2;
        if (unice[mij] == x) {
            return mij;
        }
        if (unice[mij] < x) {
            st = mij + 1;
        } else {
            dr = mij - 1;
        }
    }
    return -1;
}

int comp(vector<int>& v) {
    vector<int> copie = v;
    sort(copie.begin(), copie.end());

    vector<int> unice;
    if (!copie.empty()) {
        unice.push_back(copie[0]);
        for (size_t i = 1; i < copie.size(); ++i) {
            if (copie[i] != copie[i - 1]) {
                unice.push_back(copie[i]);
            }
        }
    }

    for (size_t i = 0; i < v.size(); ++i) {
        v[i] = s(unice, v[i]);
    }

    return (int)unice.size();
}

long long calc(const vector<int>& v, int k, int maxim) {
    if (k <= 0) return 0;

    long long raspuns = 0;
    int stanga = 0;
    int diferite = 0;
    vector<int> fr(maxim, 0);

    for (int dreapta = 0; dreapta < (int)v.size(); ++dreapta) {
        if (fr[v[dreapta]] == 0) {
            diferite++;
        }
        fr[v[dreapta]]++;

        while (diferite > k) {
            fr[v[stanga]]--;
            if (fr[v[stanga]] == 0) {
                diferite--;
            }
            stanga++;
        }

        raspuns += (dreapta - stanga + 1);
    }

    return raspuns;
}

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

    int n, l, u;
    fin >> n >> l >> u;
    
    vector<int> v(n);
    for (int i = 0; i < n; ++i) {
        fin >> v[i];
    }

    int limita = comp(v);
    
    long long sus = calc(v, u, limita);
    long long jos = calc(v, l - 1, limita);
    
    fout << sus - jos << "\n";
    
    return 0;
}