Cod sursa(job #2909649)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 14 iunie 2022 14:57:34
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#define int long long

using namespace std;

const int MAX_N = 1 << 20;
const int M = 666019;
unsigned int a[MAX_N + 1];
unsigned int val[MAX_N + 1], fr[MAX_N + 1], urm[MAX_N + 1], lst[M], nr;
unsigned int n, l, u;

unsigned int exista(unsigned int x) {
    unsigned int c = x % M;
    unsigned int p = lst[c];
    while (p != 0) {
        if (x == val[p]) {
            return p;
        }
        p = urm[p];
    }
    return 0;
}

unsigned int adauga(unsigned int x) {
    unsigned int p = exista(x);
    if (p != 0) {
        fr[p]++;
        return p;
    }
    unsigned int c = x % M;
    val[++nr] = x;
    fr[nr] = 1;
    urm[nr] = lst[c];
    lst[c] = nr;
    return nr;
}

unsigned int sterge(unsigned int x) {
    unsigned int p = exista(x);
    fr[p]--;
    return p;
}

long long Count(int k) {
    for (int i = 1; i <= n; i++) {
        fr[i] = 0;
    }
    for (int i = 0; i < M; i++) {
        lst[i] = 0;
    }
    nr = 0;
    int j = 1, cnt = 0;
    long long answer = 0;
    for (int i = 1; i <= n; i++) {
        int index = adauga(a[i]);
        if (fr[index] == 1) {
            cnt++;
        }
        while (j <= i && cnt > k) {
            int index = sterge(a[j]);
            if (fr[index] == 0) {
                cnt--;
            }
            j++;
        }
        answer += i - j + 1;
    }
    return answer;
}

signed main() {
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin >> n >> l >> u;
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }
    fout << Count(u) - Count(l - 1);
    return 0;
}