Pagini recente » Cod sursa (job #2472002) | Cod sursa (job #172976) | Cod sursa (job #240889) | Cod sursa (job #1996372) | Cod sursa (job #336874)
Cod sursa(job #336874)
#include<cstdio>
#include<vector>
using namespace std;
const unsigned int m = 699967;
const unsigned int N = (1<<20);
unsigned int* h[m],nr[m];
unsigned int ha[m],hb[m],haa[m],hbb[m];
unsigned int n,v[N];
int a,b;
void alocare()
{
for(unsigned int i=0;i<m;++i)
{
h[i]=new unsigned int[1+nr[i]];
h[i][0]=haa[i]=hbb[i]=0;
ha[i]=hb[i]=1;
}
}
void citire()
{
char s[11],*p;
scanf("%u%u%u\n",&n,&a,&b);
for(unsigned int i=0;i<n;++i)
{
scanf("%s\n",s);
for(p=s;*p;++p)
v[i]=v[i]*10+*p-'0';
++nr[v[i]%m];
}
alocare();
}
inline bool exista_a(unsigned int x)
{
unsigned int r=x%m,i,n;
for(i=ha[r],n=1+haa[r] ; i!=n ; ++i)
if(h[r][i]==x)
return true;
return false;
}
inline bool exista_b(unsigned int x)
{
unsigned int r=x%m,i,n;
for(i=hb[r],n=1+hbb[r] ; i!=n ; ++i)
if(h[r][i]==x)
return true;
return false;
}
inline void sterge_a(unsigned int x)
{
++ha[x%m];
}
inline void sterge_b(unsigned int x)
{
++hb[x%m];
}
inline void adauga_a(unsigned int x)
{
++haa[x%m];
}
inline void adauga_b(unsigned int x)
{
++hbb[x%m];
}
void calcul()
{
int reza=0,rezb=0;
unsigned int i,r;
int nra=0,nrb=0,pa=-1,pb=-1;
for(i=0;i<n;++i)
{
r=v[i]%m;
h[r][++h[r][0]]=v[i];
}
for(i=0;i<n;++i)
{
if(!exista_a(v[i]))
++nra;
adauga_a(v[i]);
while(nra==a)
{
sterge_a(v[++pa]);
if(!exista_a(v[pa]))
--nra;
}
reza+=i-pa;
}
for(i=0;i<n;++i)
{
if(!exista_b(v[i]))
++nrb;
adauga_b(v[i]);
while(nrb==b+1)
{
sterge_b(v[++pb]);
if(!exista_b(v[pb]))
--nrb;
}
rezb+=i-pb;
}
printf("%lld\n",rezb-reza);
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
citire();
calcul();
return 0;
}