Pagini recente » Cod sursa (job #1007753) | Cod sursa (job #223507) | Cod sursa (job #1149891) | Cod sursa (job #222283) | Cod sursa (job #13029)
Cod sursa(job #13029)
#include <stdio.h>
#include <string.h>
#define ui unsigned int
#define ll long long
#define maxn 1048576
#define mod 666013
#define maxl 10
int n,x,y;
ui a[maxn];
ll sol;
int c[mod][maxl],v[mod];
ui p[mod][maxl];
int add(ui x)
{
int aux=x%mod,i=0;
while ((i<v[aux]) && (p[aux][i]!=0))
{
if (p[aux][i]==x)
{
c[aux][i]++;
return 0;
}
i++;
}
v[aux]++;
p[aux][i]=x;
c[aux][i]=1;
return 1;
}
int extract(ui x)
{
int aux=x%mod,i=0;
while (p[aux][i]!=x) i++;
if (c[aux][i]>1)
{
c[aux][i]--;
return 0;
}
else {
c[aux][i]=c[aux][v[aux]];
p[aux][i]=p[aux][v[aux]];
v[aux]--;
return 1;
}
}
ll count(int x)
{
int i,j=0,diff=0;
ll rez=0;
memset(c,0,sizeof(c));
memset(p,0,sizeof(p));
memset(v,0,sizeof(v));
for (i=0;i<n;i++)
{
diff+=add(a[i]);
while ((diff>=x) && (j<n))
{
diff-=extract(a[j]);
j++;
}
rez+=j;
}
return rez;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
int i;
scanf("%d %d %d",&n,&x,&y);
for (i=0;i<n;i++) scanf("%lu",&a[i]);
sol=count(x);
// printf("%lld\n",sol);
sol=sol-count(y+1);
printf("%lld\n",sol);
return 0;
}