Pagini recente » yu | Monitorul de evaluare | Cod sursa (job #820084) | Cod sursa (job #2437461) | Cod sursa (job #2681521)
#include <cstdio>
#include <map>
#include <cctype>
using namespace std;
const int NMAX = (1 << 20) + 5;
char buffer[1 << 17];
int sz = (1 << 17), crs = (1 << 17);
void get_int(int &n)
{
for( ; crs < sz && !isdigit(buffer[crs]) ; crs ++);
if(crs == sz)
{
fread(buffer, sz, 1, stdin);
for(crs = 0 ; crs < sz && !isdigit(buffer[crs]) ; crs ++);
}
n = 0;
for( ; crs < sz && isdigit(buffer[crs]) ; crs ++)
n = n * 10 + buffer[crs] - '0';
if(crs == sz)
{
fread(buffer, sz, 1, stdin);
for(crs = 0 ; crs < sz && isdigit(buffer[crs]) ; crs ++)
n = n * 10 + buffer[crs] - '0';
}
}
int v[NMAX + 5];
long long secv(int n, int lim)
{
if(lim == 0)
return 0;
int st, dr, cnt;
long long nr = 0;
map <int, int> m;
map <int, int>::iterator it;
cnt = 0;
for(st = dr = 1 ; dr <= n ; ++ dr)
{
it = m.find(v[dr]);
if(it != m.end())
++ m[v[dr]];
else
{
m.insert({v[dr], 1});
++ cnt;
}
while(cnt > lim)
{
-- m[v[st]];
if(m[v[st]] == 0)
{
m.erase(v[st]);
-- cnt;
}
++ st;
}
nr += (dr - st + 1);
}
return nr;
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
int n, i, l, u;
get_int(n);
get_int(l);
get_int(u);
for(i = 1 ; i <= n ; ++ i)
get_int(v[i]);
printf("%lld\n", secv(n, u) - secv(n, l - 1));
return 0;
}