Pagini recente » Cod sursa (job #2171700) | Cod sursa (job #1112050) | Cod sursa (job #1916797) | Cod sursa (job #1772143) | Cod sursa (job #993657)
Cod sursa(job #993657)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMax = 1048586;
int N, L, U;
long long a[NMax], sol;
int fr1[NMax], fr2[NMax];
struct str
{
int val, poz;
bool operator <(const str &A) const
{
return val < A.val;
}
}v[NMax];
void Read()
{
freopen("secv5.in", "r", stdin);
scanf("%d %d %d", &N, &L, &U);
int i;
for(i=1; i<=N; i++)
{
scanf("%lld", &a[i]);
v[i].val = a[i];
v[i].poz = i;
}
}
inline void Normalizare()
{
sort(v+1, v+N+1);
int i;
for(i=1; i<=N; i++)
a[v[i].poz] = a[v[i-1].poz]+!(v[i].val == v[i-1].val);
}
inline void Solve()
{
int st, dr1, dr2, c1, c2;
st = dr1 = dr2 = c1 = c2 = 1;
fr1[a[1]] = fr2[a[1]] = 1;
while(dr1 <= N)
{
if(c1 < L)
{
++dr1;
if(++fr1[a[dr1]]==1)
++c1;
}
if(c2 <= U && dr2<N)
{
++dr2;
if(++fr2[a[dr2]]==1)
++c2;
}
else
if(c1>=L && c1<=U+1)
{
sol+=dr2-dr1;
if(c2 <= U)
sol++;
if(--fr1[a[st]]==0)
--c1;
if(--fr2[a[st]]==0)
--c2;
st++;
}
}
}
inline void Afisare()
{
freopen("secv5.out","w", stdout);
printf("%lld\n", sol);
}
int main()
{
Read();
Normalizare();
Solve();
Afisare();
return 0;
}