Pagini recente » Cod sursa (job #2709681) | Cod sursa (job #1150311) | Cod sursa (job #2399392) | Cod sursa (job #2189607) | Cod sursa (job #1768250)
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define BUFF_SIZE (1<<17)
#define MAXN (1<<20)
using namespace std;
int p = BUFF_SIZE - 1;
char buff[BUFF_SIZE];
inline void next_char(FILE *fin) {
if (++p == BUFF_SIZE) {
fread(buff, 1, BUFF_SIZE, fin);
p = 0;
}
}
inline int get_num(FILE *fin) {
int num = 0;
while (isdigit(buff[p]) == 0)
next_char(fin);
while (isdigit(buff[p])) {
num = num*10 + buff[p] - '0';
next_char(fin);
}
return num;
}
int v[MAXN], freq[MAXN+1];
struct Chestie {
int val, pos;
} aux[MAXN];
int comp(Chestie A, Chestie B) {
return A.val < B.val;
}
long long count_subseq(int n, int u) {
long long ans = 0LL;
int i, j, dist = 0;
memset(freq, 0, sizeof(freq));
for (i = j = 0; i < n; ++i) {
if (freq[v[i]] == 0)
++dist;
freq[v[i]]++;
while (dist > u) {
freq[v[j]]--;
if (freq[v[j]] == 0)
--dist;
++j;
}
ans += 1LL*(i - j + 1);
}
return ans;
}
int main()
{
FILE *fin, *fout;
int n, l, u, i, normval;
fin = fopen("secv5.in", "r");
n = get_num(fin); l = get_num(fin); u = get_num(fin);
for (i = 0; i < n; ++i)
aux[i] = {get_num(fin), i};
fclose(fin);
sort(aux, aux+n, comp);
v[aux[0].pos] = normval = 1;
for (i = 1; i < n; ++i) {
if (aux[i - 1].val < aux[i].val)
++normval;
v[aux[i].pos] = normval;
}
fout = fopen("secv5.out", "w");
fprintf(fout, "%lld\n", count_subseq(n, u) - count_subseq(n, l - 1));
fclose(fout);
return 0;
}