Pagini recente » Cod sursa (job #2831738) | Cod sursa (job #165912) | Cod sursa (job #1242073) | Cod sursa (job #2394503) | Cod sursa (job #336799)
Cod sursa(job #336799)
#include<cstdio>
#include<vector>
using namespace std;
const unsigned int m = 200011;
const unsigned int N = (1<<20);
const int lim = (1<<4);
unsigned int ha[m][lim][2];
unsigned int hb[m][lim][2];
unsigned int n,v[N];
int a,b;
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';
}
}
inline bool exista_a_ad(unsigned int x)
{
unsigned int r=x%m,i,n;
for(i=1,n=ha[r][0][0]+1 ; i!=n ; ++i)
if(ha[r][i][0]==x && ha[r][i][1])
{
++ha[r][i][1];
return true;
}
n=++ha[r][0][0];
ha[r][n][0]=x;
ha[r][n][1]=1;
return false;
}
inline bool exista_b_ad(unsigned int x)
{
unsigned int r=x%m,i,n;
for(i=1,n=hb[r][0][0]+1 ; i!=n ; ++i)
if(hb[r][i][0]==x && hb[r][i][1])
{
++hb[r][i][1];
return true;
}
n=++hb[r][0][0];
hb[r][n][0]=x;
hb[r][n][1]=1;
return false;
}
inline bool exista_a_st(unsigned int x)
{
unsigned int r=x%m,i,n;
for(i=1,n=ha[r][0][0]+1 ; i!=n ; ++i)
if(ha[r][i][0]==x && ha[r][i][1])
{
--ha[r][i][1];
if(ha[r][i][1])
return true;
}
return false;
}
inline bool exista_b_st(unsigned int x)
{
unsigned int r=x%m,i,n;
for(i=1,n=hb[r][0][0]+1 ; i!=n ; ++i)
if(hb[r][i][0]==x && hb[r][i][1])
{
--hb[r][i][1];
if(hb[r][i][1])
return true;
}
return false;
}
void calcul()
{
long long rez=0;
unsigned int i;
int nra=0,nrb=0,pa=-1,pb=-1;
for(i=0;i<n;++i)
{
if(!exista_a_ad(v[i]))
++nra;
if(!exista_b_ad(v[i]))
++nrb;
while(nra==a)
{
++pa;
if(!exista_a_st(v[pa]))
--nra;
}
while(nrb>b)
{
++pb;
if(!exista_b_st(v[pb]))
--nrb;
}
rez+=pa-pb;
}
printf("%lld\n",rez);
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
citire();
calcul();
return 0;
}