Pagini recente » Cod sursa (job #2344155) | Cod sursa (job #3244009) | Cod sursa (job #74746) | Cod sursa (job #131868) | Cod sursa (job #391685)
Cod sursa(job #391685)
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define maxN 1400000
int N, M, L, U, a[maxN], v[maxN], l[maxN], fol[maxN];
int sol (int x) {
int s = 1, i, nr = 1;
l[1] = 1;
memset(fol, 0, sizeof(fol));
fol[v[1]] = 1;
for (i = 2; i <= N; ++ i) {
if (fol[v[i]] == 0)
nr ++;
fol[v[i]] ++;
l[i] = l[i - 1];
while (nr > x) {
fol[v[l[i]]] --;
if (fol[v[l[i]]] == 0) nr --;
l[i] ++;
}
s += i - l[i] + 1;
// fprintf(stderr, "i = %d l[i] = %d nr = %d v[i] = %d fol[v[i]] = %d\n", i, l[i], nr, v[i], fol[v[i]]);
}
// printf("Sol = %d\n", s);
return s;
}
int main () {
int i, j, step, s;
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d%d%d", &N, &L, &U);
for (i = 1; i <= N; ++ i) {
scanf("%d", v + i);
a[i] = v[i];
}
sort(a + 1, a + N + 1);
M = unique(a + 1, a + N + 1) - a - 1;
for (step = 1; step <= M; step <<= 1);
for (i = 1; i <= N; ++ i) {
for (s = step, j = 1; s; s >>= 1)
if (j + s <= M && a[j + s] <= v[i])
j += s;
v[i] = j;
}
printf("%d\n", sol(U) - sol(L - 1));
}