Pagini recente » Cod sursa (job #1327419) | Cod sursa (job #669052) | Cod sursa (job #2418584) | Cod sursa (job #592110) | Cod sursa (job #3265235)
#include <bits/stdc++.h>
using namespace std;
struct el
{
int r,i;
};
el s[500005];
int v[500005];
bool ord(const el & a,const el & b)
{
if(a.r<b.r || a.r==b.r && a.i<b.i)
{
return true;
}
return false;
}
int main()
{
ifstream cin("divk.in");
ofstream cout("divk.out");
int n,k,a,b,sum;
cin>>n>>k>>a>>b;
sum=0;
for(int i=1;i<=n;++i)
{
cin>>v[i];
sum+=v[i];
sum%=k;
s[i].r=sum;
s[i].i=i;
}
sort(s+1,s+n+1,ord);
int ik=0,cnt=0;
for(int i=1;i<=n;++i)
{
if(i==1 || s[i].r!=s[i-1].r)
{
ik=i;
}
int st=ik,dr=i,in1=ik-1,in2=-1,mij;
while(st<=dr)
{
mij=(st+dr)/2;
if((s[i].i-a)>=s[mij].i)
{
st=mij+1;
in2=mij;
}
else
{
dr=mij-1;
}
}
if(in1!=-1)
{
in1=in2+1;
st=ik;
dr=i;
while(st<=dr)
{
mij=(st+dr)/2;
if((s[i].i-b)<=s[mij].i)
{
dr=mij-1;
in1=mij;
}
else
{
st=mij+1;
}
}
}
if(s[i].i>=a && s[i].i<=b && s[i].r==0)
{
++cnt;
}
if(in2!=-1)
{
cnt=cnt+(in2-in1+1);
}
}
cout<<cnt;
return 0;
}