Pagini recente » Cod sursa (job #1479985) | Istoria paginii runda/iconcurs12 | Istoria paginii utilizator/ilariana_nik | Cod sursa (job #2275765) | Cod sursa (job #120429)
Cod sursa(job #120429)
#include <stdio.h>
#include <vector>
using namespace std;
#define maxn 1048576
#define nr 666013
#define mod 131072
#define ui unsigned int
#define ll long long
#define uc unsigned char
#define pb push_back
#define pp pop_back()
int n,x,y;
ll sol;
ui a[maxn];
vector <ui> b[mod];
vector <uc> c[mod];
inline int add(ui x)
{
ui y = (x * nr) >> 15;
int l = b[y].size(), i;
for (i=0;i<l;i++)
if (b[y][i] == x)
{
c[y][i]++;
return 0;
}
b[y].pb(x);
c[y].pb(1);
return 1;
}
inline int erase(ui x)
{
ui y = ((ui) x * nr) >> 15;
int l = b[y].size(), i;
for (i=0;i<l;i++)
if (b[y][i] == x)
{
if (c[y][i]>1)
{
c[y][i] --;
return 0;
}
else {
c[y][i] = c[y][l-1];
b[y][i] = b[y][l-1];
b[y].pp;
c[y].pp;
return 1;
}
break;
}
return 0;
}
ll solve(int x)
{
int i,j,v=0;
ll rez=0;
for (i=0, j=0;i<n;i++)
{
v += add(a[i]);
for (;j<=i && v>=x;j++) v -= erase(a[j]);
rez += j;
}
return rez;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d %d %d ",&n,&x,&y);
int i;
for (i=0;i<n;i++) scanf("%u ",&a[i]);
sol = solve(x);
for (i=0;i<mod;i++)
{
c[i].clear();
b[i].clear();
}
sol -= solve(y+1);
printf("%lld\n",sol);
return 0;
}