Pagini recente » Cod sursa (job #1845042) | Cod sursa (job #340681) | Cod sursa (job #1236395) | Cod sursa (job #1476294) | Cod sursa (job #120474)
Cod sursa(job #120474)
#include <stdio.h>
#include <string>
using namespace std;
#define maxn 1048576
#define nr 666013
#define mod 131072
#define maxl 13
#define maxk 16
#define ll long long
#define ui unsigned int
#define uc unsigned char
int n,x,y;
ll sol;
ui a[maxn];
char r[maxl];
ui h[maxk][mod];
uc c[maxk][mod];
char v[mod];
inline char add(ui x)
{
ui y = ((ui) x * nr) >> 15;
int i;
for (i=0;i<v[y];++i)
if (h[i][y] == x)
{
c[i][y]++;
return 0;
}
h[v[y]][y] = x;
c[v[y]][y] = 1;
v[y]++;
return 1;
}
inline char erase(ui x)
{
ui y = ((ui) x * nr) >> 15;
int i;
for (i=0;i<v[y];++i)
if (h[i][y] == x)
if (c[i][y]>1)
{
c[i][y]--;
return 0;
}
else {
v[y]--;
h[i][y] = h[v[y]][y];
c[i][y] = h[v[y]][y];
return 1;
}
return 1;
}
inline ll solve(int x)
{
ll rez=0;
int i,j=0,diff=0;
for (i=0;i<n;++i)
{
diff += add(a[i]);
while (j<=i && diff>x)
{
diff -= erase(a[j]);
++j;
}
rez += i-j+1;
}
return rez;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d %d %d ",&n,&x,&y);
int i,j;
for (i=0;i<n;++i)
{
fgets(r,maxl,stdin);
for (j=0;r[j]!='\n';++j) a[i] = a[i] * 10 + r[j] - '0';
}
sol = solve(y);
memset(v,0,sizeof(v));
sol -= solve(x-1);
printf("%lld\n",sol);
return 0;
}