Pagini recente » Cod sursa (job #1549625) | Cod sursa (job #2962544) | Cod sursa (job #1611157) | Cod sursa (job #3120990) | Cod sursa (job #2877481)
#include <fstream>
#include <algorithm>
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], v2[NMAX + 2];
int ct[NMAX + 2];
int l1 = 1, r1, l2 = 1, r2;
unsigned int d1[NMAX + 2], d2[NMAX + 2];
int vf1[NMAX + 2], vf2[NMAX + 2];
int count1, count2;
int main() {
cin >> N >> L >> U;
for (int i = 1; i <= N; ++i) {
cin >> v[i];
v2[i] = v[i];
}
sort(v2 + 1, v2 + N + 1);
for(int i = 1; i <= N; i++) {
if(v2[i] > v2[i - 1]) {
ct[i - 1] = ct[i] + 1;
} else {
ct[i - 1] = ct[i];
}
}
for(int i = 1; i <= N; i++) {
int l = 1, r = N;
while(l <= r) {
int mid = (l + r) >> 1;
if(v2[mid] == v[i]) {
v[i] = ct[mid];
break;
} else if(v2[mid] > v[i]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
}
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;
}