Pagini recente » Cod sursa (job #2847345) | Cod sursa (job #1443618) | Cod sursa (job #515515) | Cod sursa (job #1877518) | Cod sursa (job #2632561)
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
///***********************
typedef long long int64;
typedef unsigned uint;
const int P = 666013, NMAX = 1 << 20 + 3;
vector<pair<uint, uint>> hashTab[P + 3];
int n, l, u, nrDis;
uint v[NMAX];
void addInHT(uint 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(uint 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(uint maxDis) {
int64 ans = 0;
reset();
for (int p1 = 1, p2 = 1; p2 <= n; p2++) {
addInHT(v[p2]);
while (nrDis > maxDis)
deleteInHT(v[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;
}