Pagini recente » Cod sursa (job #2133305) | Cod sursa (job #960288) | Cod sursa (job #918849) | Cod sursa (job #2937445) | Cod sursa (job #120623)
Cod sursa(job #120623)
#include <cstdio>
#define fin "secv5.in"
#define fout "secv5.out"
#define DBxG
#define FL
const int Mod = 672331;
const int Nmax = 1111100;
struct inf {
unsigned int val;
int id;
inf *next;
};
inf *hash[Mod];
int N,U,L,K;
unsigned int v[Nmax];
long long ret;
int frcv1[Nmax],frcv2[Nmax];
void readdata()
{
int i;
freopen(fin,"r",stdin);
scanf("%d%d%d",&N,&L,&U);
for (i=1;i<=N;++i)
scanf("%u",&v[i]);
}
void inithash()
{
int i;
for (i=0;i<Mod;++i)
{
hash[i] = new inf;
hash[i] -> next = NULL;
}
}
void insert(int p)
{
inf *it,*nou;
it = hash[v[p] % Mod];
while ( it -> next != NULL )
{
if ( it -> next -> val == v[p] )
{
v[p] = it -> next -> id;
return ;
}
it = it -> next;
}
if ( it -> next == NULL )
{
nou = new inf;
nou -> val = v[p];
nou -> id = ++K;
nou -> next= NULL;
v[p] = K;
it -> next = nou;
}
}
void normalizeaza()
{
int i;
inithash();
for (i=1;i<=N;++i)
insert(i);
#ifdef DBG
for (i=1;i<=N;++i)
printf("%u ",v[i]);
printf("\n");
#endif
}
void solve()
{
int i,st,dr,cnt1,cnt2;
st=1;
dr=1;
cnt1=cnt2=0;
for (i=1;i<=N;++i)
{
++frcv1[ v[i] ];
++frcv2[ v[i] ];
if ( frcv1[v[i]] == 1 )
++cnt1;
if ( frcv2[v[i]] == 1 )
++cnt2;
while ( cnt1 > U )
{
--frcv1[ v[st] ];
if ( frcv1[ v[st] ] == 0 )
--cnt1;
++st;
}
while ( cnt2 >= L )
{
--frcv2[ v[dr] ];
if ( frcv2[ v[dr] ] == 0 )
--cnt2;
++dr;
}
if ( dr > st )
ret = ret + dr - st;
}
#ifdef FL
freopen(fout,"w",stdout);
#endif
printf("%lld\n",ret);
}
int main()
{
readdata();
normalizeaza();
solve();
return 0;
}