Pagini recente » Cod sursa (job #1353107) | Cod sursa (job #1407914) | Cod sursa (job #14878) | Cod sursa (job #815899) | Cod sursa (job #9343)
Cod sursa(job #9343)
#include <cstdio>
#include <map>
using namespace std;
#define Nmax (1 << 20)
map<int, int> H, M;
long long rez;
int n, a, b, cnt, cnt2;
int v[Nmax];
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("%d", &v[i]);
}
int main()
{
int i, j, k;
long long aux;
readdata();
j = 0;
k = 0;
for (i = 0; i < n; ++i)
{
if (H.find(v[i]) == H.end())
{
H[v[i]] = 1;
M[v[i]] = 1;
++cnt;
++cnt2;
}
else
{
++H[v[i]];
++M[v[i]];
}
while (cnt > b)
{
--H[v[j]];
if (H[v[j]] == 0)
{
H.erase( H.find(v[j]) );
--cnt;
}
++j;
}
while (cnt2 > a || (cnt2 == a && M[v[k]] > 1))
{
--M[v[k]];
if (M[v[k]] == 0)
{
M.erase( M.find(v[k]) );
--cnt2;
}
++k;
}
if (cnt >= a)
{
aux = k-j+1;
rez += aux;
}
}
printf("%lld\n", rez);
return 0;
}