Cod sursa(job #2632559)

Utilizator pregoliStana Andrei pregoli Data 3 iulie 2020 19:47:30
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
///***********************
typedef long long int64;
const int P = 666013, NMAX = 1 << 21;
vector<pair<int, int>> hashTab[P + 3];
int v[NMAX], n, l, u, nrDis;

void addInHT(int x) {
    int rem = x % P;
    for (auto& it : hashTab[rem])
        if (it.first == x) {
            it.second++;
            return;
        }
    hashTab[rem].push_back({x, 1});
    nrDis++;
}

void deleteInHT(int x) {
    int rem = x % P;
    size_t i;
    for (i = 0; i < hashTab[rem].size(); i++)
        if (hashTab[rem][i].first == x) {
            hashTab[rem][i].second--;
            break;
        }
    if (!hashTab[rem][i].second) {
        swap(hashTab[rem][i], hashTab[rem].back());
        hashTab[rem].pop_back();
        nrDis--;
    }
}

void reset() {
    nrDis = 0;
    for (int i = 0; i < P; i++)
        hashTab[i].clear();
}

int64 solve(int maxDis) {
    int64 ans = 0;
    reset();
    for (int p1 = 1, p2 = 1; p2 <= n; p2++) {
        addInHT(v[p2]);
        while (nrDis > maxDis) {
            deleteInHT(v[p1]);
            p1++;
        }
        ans = ans + 1LL * (p2 - p1 + 1);
    }
    return ans;
}

int main() {
    fin >> n >> l >> u;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    fout << solve(u) - solve(l - 1) << newline;
    fout.close();
    return 0;
}