Pagini recente » Cod sursa (job #1608831) | Cod sursa (job #2368146) | Cod sursa (job #2452685) | Cod sursa (job #1562784) | Cod sursa (job #2885044)
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
#define cin f
#define cout g
// #define int long long
const int Max = 1<<20 + 1;
void nos()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
}
FILE *fin = fopen("secv5.in", "r");
const int bsize = 1<<16; //bsize = dimensiunea blocurilor in care sparg fisierul de intrare
char buff[bsize];
int poz = bsize;
inline char next() //citeste urmatorul caracter
{
if (poz == bsize) //daca am terminat de procesat blocul actual, mai citesc inca un bloc
{
fread(buff, 1, bsize, fin);
poz = 0;
}
return buff[poz++];
}
int nr() //citeste un numar pozitiv
{
int x = 0;
char c;
do
{
c = next();
} while (isdigit(c) == 0); //sar peste spatii
while (isdigit(c)) //citesc cifra cu cifra
{
x = x * 10 + c-48;
c = next();
}
return x;
}
int n,l,u;
unsigned int a[Max];
void read()
{
f>>n>>l>>u;
int i;
for(i=1;i<=n;i++)
a[i] = nr();
}
long long get_val(int k)
{
if(k == 0)
return 0LL;
long long ans = 0;
int i;
unordered_map < unsigned int , int > fr;
int len = 0;
int j = 1;
for(i=1;i<=n;i++)
{
fr[a[i]]++;
if(fr[a[i]] == 1) len ++;
while(len > k)
{
fr[a[j]] --;
if(fr[a[j]] == 0)
len --;
j++;
}
ans += i - j + 1;
}
return ans;
}
void solve()
{
g << get_val(u) - get_val(l - 1);
}
void restart()
{
}
int32_t main()
{
nos();
read();
solve();
restart();
return 0;
}