Pagini recente » Cod sursa (job #1034135) | Cod sursa (job #717259) | Cod sursa (job #1609321) | Cod sursa (job #750259) | Cod sursa (job #332045)
Cod sursa(job #332045)
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const unsigned int maxn=1200000;
const unsigned int mod=479909;
struct nod
{
unsigned int v;
unsigned int ord;
};
vector<nod>hash[mod];
unsigned int n,i,a[maxn],x,p=1024,l,u,numbers,q,v[maxn],l1[maxn],l2[maxn];
char s[1024];
void cit(unsigned int &x)
{
x=0;
if(p==1024)
fread(s,1,1024,stdin),p=0;
while(s[p]<'0'||s[p]>'9')
{
++p;
if(p==1024)
fread(s,1,1024,stdin),p=0;
}
while(s[p]>='0'&&s[p]<='9')
{
x=(x<<1)+(x<<3)+s[p]-'0';
++p;
if(p==1024)
fread(s,1,1024,stdin),p=0;
}
}
inline unsigned int insert(unsigned int x)
{
unsigned int list=x%mod;
vector<nod>::iterator it;
for(it=hash[list].begin();it!=hash[list].end();++it)
if(it->v==x)
break;
if(it==hash[list].end())
{
nod k;
k.v=x;
k.ord=++numbers;
hash[list].push_back(k);
return numbers;
}
return it->ord;
}
long long rez;
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
cit(n);
cit(l);
cit(u);
for(i=1;i<=n;++i)
{
cit(x);
a[i]=insert(x);
}
--l;
l1[1]=1;
v[a[1]]=1;
unsigned int nr=1;
for(i=2;i<=n;++i)
{
l1[i]=l1[i-1];
if(v[a[i]]==0)
++nr;
++v[a[i]];
while(nr>u)
{
--v[a[l1[i]]];
if(v[a[l1[i]]]==0)
--nr;
++l1[i];
}
}
memset(v,0,sizeof(v));
if(l>0)
{
l2[1]=1;
v[a[1]]=1;
nr=1;}
else
{
l2[1]=2;
nr=0;
}
for(i=2;i<=n;++i)
{
l2[i]=l2[i-1];
if(v[a[i]]==0)
++nr;
++v[a[i]];
while(nr>l)
{
--v[a[l2[i]]];
if(v[a[l2[i]]]==0)
--nr;
++l2[i];
}
}
for(i=1;i<=n;++i)
rez+=l2[i]-l1[i];
printf("%lld\n",rez);
fclose(stdin);
fclose(stdout);
return 0;
}