Pagini recente » Cod sursa (job #3225016) | Cod sursa (job #824766) | Cod sursa (job #3161104) | Cod sursa (job #167196) | Cod sursa (job #1065273)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
struct elem
{
long long int val;
int poz;
}v[1048580];
long long int m[1048580];
bool operator<(const elem &a,const elem &b)
{
if(a.val<b.val)
return 1;
return 0;
}
#define lsb(i) (i&(-i))
long long int aib[1048580];
long long int sum(long long int poz)
{
//cout<<"sum("<<poz<<")="<<endl;
long long int s=0;
for(;poz>0;poz-=lsb(poz))
{
//cout<<"poz="<<poz<<endl;
s+=aib[poz];
}
return s;
}
long long int n;
void update(long long int poz,long long int val)
{
for(;poz<=n;poz+=lsb(poz))
aib[poz]+=val;
}
int l,u;
int caut_bin(long long int x)
{
int st=1,dr=x,mijl=(x+1)>>1;
int rasp1=x+1;
int aux;
while(st<=dr)
{
aux=sum(x)-sum(mijl-1);
if(aux<=u)
{
if(mijl<rasp1)
rasp1=mijl;
dr=mijl-1;
}
else
st=mijl+1;
mijl=(st+dr)>>1;
}
st=1;
dr=x;
mijl=(x+1)>>1;
int rasp2=-1;
while(st<=dr)
{
aux=sum(x)-sum(mijl-1);
if(aux>=l)
{
if(mijl>rasp2)
rasp2=mijl;
st=mijl+1;
}
else
dr=mijl-1;
mijl=(st+dr)>>1;
}
if(rasp2<rasp1)
return 0;
else
return (rasp2-rasp1+1);
}
long long int data[1048580];
int main()
{
ifstream cin("secv5.in");
ofstream cout("secv5.out");
long long int i;
cin>>n>>l>>u;
for(i=1;i<=n;i++)
{
cin>>m[i];
v[i].val=m[i];
v[i].poz=i;
}
sort(v+1,v+n+1);
long long int ante=0;
int curent=0;
for(i=1;i<=n;i++)
{
if(ante!=v[i].val)
{
ante=v[i].val;
curent++;
}
m[v[i].poz]=curent;
}
memset(data,-1,sizeof(data));
long long int s=0;
for(i=1;i<=n;i++)
{
if(data[m[i]]!=-1)
update(data[m[i]],-1);
update(i,1);
data[m[i]]=i;
s+=caut_bin(i);
}
cout<<s<<'\n';
cin.close();
cout.close();
return 0;
}