Cod sursa(job #1721211)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 24 iunie 2016 20:47:47
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <bits/stdc++.h>
using namespace std;

vector<int> v[100005];

int main(void) {
    freopen("divk.in",  "r", stdin);
    freopen("divk.out", "w", stdout);
    int n, k, a, b, t, st, dr;
    long long ans;

    ans = 0LL;
    v[0].push_back(-1);

    scanf("%d%d%d%d",&n,&k,&a,&b);
    for(int i=0, s=0; i<n; ++i) {
        scanf("%d",&t);
        s+=t;
        s%=k;

        st = -1;
        dr = -1;
        for(int m=1<<20; m; m>>=1)
            if(st+m<v[s].size() && i-v[s][st+m]<a)
                st+=m;
        for(int m=1<<20; m; m>>=1)
            if(dr+m<v[s].size() && i-v[s][dr+m]<b)
                dr+=m;

        v[s].push_back(i);
        ans+=dr-st;
    }

    printf("%lld\n",ans);

    fclose(stdin);
    fclose(stdout);
    return 0;
}