Cod sursa(job #3265236)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 28 decembrie 2024 11:46:39
Problema Divk Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#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(in2!=-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;
}