#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
using namespace std;
#define MAX_N ((1 << 20)+16)
typedef long long llong;
int N, U, L, Ind, Nr_unu[MAX_N], Nr_doi[MAX_N], Pos[MAX_N];
unsigned X[MAX_N], V[MAX_N];
llong res;
int get_pos(unsigned x)
{
int st = 1, dr = Ind, m, r;
while(st <= dr)
{
m = (st+dr) >> 1;
if(V[m] <= x)
r = m, st = m+1;
else
dr = m-1;
}
return r;
}
void solve(void)
{
int i, p, q, t, aux, cnt_unu = 0, cnt_doi;
unsigned x, v;
for(i = 1; i <= N; i++)
Pos[i] = get_pos(X[i]);
p = q = 1, cnt_unu = cnt_doi = 1, t = Pos[1];
Nr_unu[t]++, Nr_doi[t]++;
if(L == 1)
res++;
for(i = 2; i <= N; i++)
{
x = X[i], t = aux = Pos[i];
if(Nr_unu[t] == 0)
{
cnt_unu++;
Nr_unu[t]++;
if(cnt_unu == L)
{
while( Nr_unu[Pos[p]] >= 2 )
Nr_unu[t]--, p++;
}
if(cnt_unu > L)
{
while(p < i)
{
Nr_unu[Pos[p++]]--;
if(Nr_unu[t] == 0)
break ;
}
while( Nr_unu[Pos[p]] >= 2 )
Nr_unu[t]--, p++;
}
}
else
{
Nr_unu[t]++;
if(cnt_unu >= L)
while( Nr_unu[Pos[p]] >= 2 )
Nr_unu[t]--, p++;
}
t = aux;
if(Nr_doi[t] == 0)
{
cnt_doi++;
Nr_doi[t]++;
if(cnt_doi > U)
{
while(q < i)
{
Nr_doi[Pos[q++]]--;
if(Nr_doi[t] == 0)
break ;
}
}
}
else
Nr_doi[t]++;
if(cnt_unu >= L)
res += (llong)(p-q+1);
}
}
void read_data(void)
{
int i, ind;
unsigned x;
char sir[1024];
scanf("%d %d %d\n", &N, &L, &U);
for(i = 1; i <= N; i++)
{
fgets(sir, 1024, stdin), ind = 0, x = 0;
for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
x = x*10+(unsigned)(sir[ind]-48);
X[i] = x, V[i] = x;
}
sort(V+1, V+N+1);
for(ind = 1, i = 2; i <= N; i++)
if(V[i] != V[ind])
V[++ind] = V[i];
Ind = ind;
}
void write_data(void)
{
printf("%lld\n", res);
}
int main(void)
{
freopen("secv5.in", "rt", stdin);
freopen("secv5.out", "wt", stdout);
//int start = clock(), end;
read_data();
solve();
write_data();
// end = clock();
// fprintf(stderr, "%lf\n", (double)(end-start) / CLK_TCK);
return 0;
}