Cod sursa(job #1561218)

Utilizator antanaAntonia Boca antana Data 3 ianuarie 2016 19:40:00
Problema Divk Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <vector>
#define MAX 100000
using namespace std;
vector<int> v[MAX+1];
int main()
{
    freopen("divk.in", "r", stdin);
    freopen("divk.out", "w", stdout);
    int n, k,a,b, i, s=0, st, dr, mij,  x, j;
    long long r=0, poza, pozb;
    scanf("%d%d%d%d", &n, &k, &a, &b);
    v[0].push_back(0);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &x);
        s=(s+x)%k;
        v[s].push_back(i);
    }
    for(i=0;i<k;i++)
    {
        for(j=0;j<v[i].size();j++)
        {
            st=j+1;
            dr=v[i].size()-1;
            poza=0;
            pozb=-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[i][mij]-v[i][j]>=a){
                    if(v[i][mij]-v[i][j]<=b) poza=mij;
                    dr=mij-1;
                }
                else st=mij+1;
            }
            st=j+1;
            dr=v[i].size()-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[i][mij]-v[i][j]<=b)
                {
                    if (v[i][mij]-v[i][j]>=a) pozb=mij;
                    st=mij+1;
                }else dr=mij-1;
            }
            r+=pozb-poza+1;
        }
    }
    printf("%lld", r);
    return 0;
}