Pagini recente » Cod sursa (job #2353923) | Cod sursa (job #2447821) | Cod sursa (job #2849845) | Cod sursa (job #2615049) | Cod sursa (job #10025)
Cod sursa(job #10025)
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define Nmax (1 << 20)
unsigned int v[Nmax], u[Nmax];
int frec[Nmax];
int n, m, a, b;
void readdata()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &n, &a, &b);
for (int i = 0; i < n; ++i)
scanf("%u", &v[i]);
}
int cauta(unsigned int x)
{
int st = 0, dr = m, mij;
while (st < dr)
{
mij = (st+dr)/2;
if (u[mij] < x) st = mij+1;
else dr = mij;
}
return st;
}
long long eval(int k)
{
int i, j = 0, cnt = 0;
long long rez = 0;
memset(frec, 0, sizeof(frec));
for (i = 0; i < n; ++i)
{
if (frec[v[i]] == 0)
{
frec[v[i]] = 1;
++cnt;
}
else ++frec[v[i]];
while (cnt > k)
{
--frec[v[j]];
if (frec[v[j]] == 0) --cnt;
++j;
}
rez += (long long)(i-j+1);
}
return rez;
}
void solve()
{
int i;
for (i = 0; i < n; ++i)
u[i] = v[i];
sort(u, u+n);
for (i = 1; i < n; ++i)
if (u[i] > u[i-1]) u[++m] = u[i];
for (i = 0; i < n; ++i)
v[i] = cauta(v[i]);
printf("%lld\n", eval(b) - eval(a-1));
}
int main()
{
readdata();
solve();
return 0;
}