Pagini recente » Cod sursa (job #2387217) | Cod sursa (job #670839) | Cod sursa (job #3191204) | Cod sursa (job #2567391) | Cod sursa (job #12782)
Cod sursa(job #12782)
#include<stdio.h>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn = 1048576;
unsigned int i;
unsigned int l[maxn];
unsigned int n;
unsigned int v[maxn];
unsigned int a[maxn];
unsigned int cnt;
unsigned int s;
unsigned int t;
unsigned int cont[maxn];
unsigned int b[maxn];
long long calc(unsigned int x)
{
if (x==0) return 0;
l[0]=1;
memset(v,0,sizeof(v));
cnt=0;
for(i=0;i<=n-1;i++)
{
l[i]=l[i-1];
v[a[i]]++;
if (v[a[i]]==1) cnt++;
while(cnt>x)
{
l[i]++;
v[a[l[i]-1]]--;
if (v[a[l[i]-1]]==0) cnt--;
}
}
long long sum=0;
for(i=0;i<=n-1;i++)
sum+=(long long)((LL)i-l[i]+1);
return sum;
}
unsigned int bs(unsigned int i)
{
unsigned int p,x=0;
for(p=1;p<=n-1;p<<=1);
for(;p;p>>=1)
if (b[x+p]<=i&&x+p<=n-1) x+=p;
return x;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d %d %d",&n,&s,&t);
for(i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
cont[0]=1;
for(i=1;i<=n-1;i++)
{
if (b[i]!=b[i-1])
{
cont[i]=cont[i-1]+1;
}
else cont[i]=cont[i-1];
}
for(i=0;i<=n-1;i++)
{
a[i]=cont[bs(a[i])];
}
long long sol;
sol=(long long)calc(t)-(LL)calc(s-1);
printf("%lld",sol);
return 0;
}