Pagini recente » Cod sursa (job #1136240) | Cod sursa (job #1675523) | Cod sursa (job #1959067) | Cod sursa (job #2911416) | Cod sursa (job #2047562)
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
unsigned int v[1<<21];
int vv[1<<21],f[1<<21];
const int p=65537;
vector<unsigned int>g1[p+1];
vector<unsigned int>g2[p+1];
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
int l,u,n,i,nr=0,j;
long long nrl=0,nru=0;
scanf("%d%d%d",&n,&l,&u);
for(i=1; i<=n; ++i)
{
scanf("%u",&v[i]);
bool ok=0;
for(j=0; j<g1[v[i]%p].size(); ++j)
{
if(g1[v[i]%p][j]==v[i])
{
vv[i]=g2[v[i]%p][j];
ok=1;
break;
}
}
if(!ok)
{
g1[v[i]%p].push_back(v[i]);
g2[v[i]%p].push_back(++nr);
vv[i]=nr;
}
}
if(l>1)
{
int poz=1;
nr=0;
nrl=(1LL*l*(l-1))/2;
for(i=1; i<=l-1; ++i)
{
if(!f[vv[i]])
nr++;
f[vv[i]]++;
}
for(i=l; i<=n; ++i)
{
if(!f[vv[i]])
nr++;
f[vv[i]]++;
if(nr==l)
{
while(nr==l)
{
f[vv[poz]]--;
if(!f[vv[poz]])
nr--;
poz++;
}
}
nrl+=(long long)(i+1-poz);
}
}
memset(f,0,sizeof(f));
int poz=1;
nr=0;
nru=(1LL*u*(u+1))/2;
for(i=1; i<=u; ++i)
{
if(!f[vv[i]])
nr++;
f[vv[i]]++;
}
for(i=u+1; i<=n; ++i)
{
if(!f[vv[i]])
nr++;
f[vv[i]]++;
if(nr==u+1)
{
while(nr==u+1)
{
f[vv[poz]]--;
if(!f[vv[poz]])
nr--;
poz++;
}
}
nru+=(long long)(i+1-poz);
}
printf("%lld\n",nru-nrl);
return 0;
}