Cod sursa(job #1397651)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 23 martie 2015 17:40:26
Problema Divk Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>
#include <queue>
#include <algorithm>

#define Nmax 500010
#define Kmax 100000

using namespace std;

int n , k , a , b , sol , i , Poz1 , Poz2;

int A[Nmax] , Mod[Nmax];

deque < int > S[Kmax];
queue < pair < int , int > > moment;

int main()
{
    freopen("divk.in","r",stdin);
    freopen("divk.out","w",stdout);

    scanf("%d %d %d %d", &n, &k, &a, &b);

    moment.push(make_pair(a , 0));

    for (i = 1; i <= n; ++i)
    {
        while (moment.front().first == i)
        {
            S[moment.front().second].push_back(i - a);
            moment.pop();
        }

        scanf("%d", &A[i]);
        Mod[i] = (Mod[i-1] + A[i]) % k;

        while (i - S[Mod[i]][0] > b && S[Mod[i]].size()) S[Mod[i]].pop_front();

        sol += S[Mod[i]].size();

        moment.push(make_pair(i + a , Mod[i]));
    }

    printf("%d\n", sol);

    return 0;
}