// SortChar.cpp : Defines the entry point for the console application.
//
#include <queue>
#include <string>
#include <fstream>
#define PRIME 2531
using namespace std;
ifstream f("secv5.in");
ofstream fout("secv5.out");
struct Hash{
vector < pair<int,int> > numbers;
}H[PRIME];
int counter = 0;
int isInHash(int number) {
int key = number % PRIME;
for (int i = 0; i < H[key].numbers.size(); i++) {
if (H[key].numbers[i].first == number) return 1;
}
return 0;
}
void addNumber(int number) {
int key = number % PRIME;
H[key].numbers.push_back(make_pair(number, 1));
counter++;
}
void removeNumber(int number) {
int key = number % PRIME;
for (int i = 0; i < H[key].numbers.size(); i++) {
if (H[key].numbers[i].first == number) {
H[key].numbers.erase(H[key].numbers.begin() + i);
break;
}
}
}
void update(int number, int numToAdd) {
int key = number % PRIME;
for (int i = 0; i < H[key].numbers.size(); i++) {
if (H[key].numbers[i].first == number) {
H[key].numbers[i].second += numToAdd;
if (H[key].numbers[i].second == 0) {
H[key].numbers.erase(H[key].numbers.begin() + i);
counter--;
}
break;
}
}
}
int main() {
queue <int> numbers;
vector <int> elements;
int n = 0, l = 0, g = 0, solution = 0, x = 0;
f >> n >> l >> g;
while (n--) {
f >> x;
elements.push_back(x);
}
int i = 0, j = 0;
while (i < elements.size()) {
x = elements[j];
numbers.push(x);
if (isInHash(x)) {
update(x, 1);
} else {
addNumber(x);
}
if (counter >= l && counter <= g) {
solution++;
}
if (counter > g) {
while (!numbers.empty()){
int valoare = numbers.front();
numbers.pop();
update(valoare, -1);
}
i++;
j = i - 1;
}
j++;
if (j == elements.size()) {
while (!numbers.empty()){
int valoare = numbers.front();
numbers.pop();
update(valoare, -1);
}
i++;
j = i ;
}
}
fout << solution;
return 0;
}