Cod sursa(job #2877097)

Utilizator trifangrobertRobert Trifan trifangrobert Data 24 martie 2022 09:35:56
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = (1 << 20);
int N, L, U;
unsigned int v[NMAX];
pair <unsigned int, unsigned int> a[NMAX];
int freq[NMAX + 5];

long long Solve(const int &K) {
    for (int i = 1; i <= NMAX; ++i) {
        freq[i] = 0;
    }
    int sz = 0;
    long long cnt = 0;
    for (int i = 0, j = 0; i < N; ++i) {
        freq[v[i]] += 1;
        if (freq[v[i]] == 1) {
            ++sz;
        }
        while (sz > K) {
            freq[v[j]]--;
            if (freq[v[j]] == 0) {
                --sz;
            }
            ++j;
        }
        cnt = 1LL * cnt + (i - j + 1);
    }
    return cnt;
}

int main() {
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin >> N >> L >> U;
    for (int i = 0; i < N; ++i) {
        fin >> a[i].first;
        a[i].second = i;
    }
    sort(a, a + N);
    int val = 0;
    for (int i = 0; i < N; ++i) {
        if (a[i].first != a[i - 1].first) {
            val++;
        }
        v[a[i].second] = val;
    }
    fout << Solve(U) - Solve(L - 1) << "\n";
    fin.close();
    fout.close();
    return 0;
}