Pagini recente » Cod sursa (job #1720586) | Cod sursa (job #2170535) | Cod sursa (job #155441) | Cod sursa (job #2086068) | Cod sursa (job #2877076)
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
#include <fstream>
#include <unordered_map>
using namespace std;
const int NMAX = 1 << 20;
ifstream cin("secv5.in");
ofstream cout("secv5.out");
int N, L, U;
unsigned int v[NMAX + 2];
int l1 = 1, r1, l2 = 1, r2;
unsigned int d1[NMAX + 2], d2[NMAX + 2];
unordered_map<unsigned int, int> vf1, vf2;
int count1, count2;
int main() {
cin >> N >> L >> U;
for (int i = 1; i <= N; ++i) {
cin >> v[i];
}
long long sol = 0;
for (int i = 1; i <= N; ++i) {
if (vf1[v[i]] == 0) {
count1++;
}
vf1[v[i]]++;
d1[++r1] = i;
if (vf2[v[i]] == 0) {
count2++;
}
vf2[v[i]]++;
d2[++r2] = i;
while (count1 > U) {
if (vf1[v[d1[l1]]] == 1) {
count1--;
}
vf1[v[d1[l1]]]--;
l1++;
}
int last = -1;
while (count2 >= L) {
last = d2[l2];
if (vf2[v[d2[l2]]] == 1) {
count2--;
}
vf2[v[d2[l2]]]--;
l2++;
}
if (last != -1) {
if (vf2[v[last]] == 0) {
count2++;
}
vf2[v[last]]++;
d2[--l2] = last;
}
if (count2 >= L) {
sol += (d2[l2] - d1[l1] + 1);
}
}
cout << sol << '\n';
return 0;
}