Pagini recente » Cod sursa (job #273275) | Cod sursa (job #2609371) | Cod sursa (job #3164023) | Cod sursa (job #197413) | Cod sursa (job #2877073)
#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;
}