Cod sursa(job #1560104)

Utilizator antanaAntonia Boca antana Data 1 ianuarie 2016 19:09:44
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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, i, a, b,k, st, dr, mij, sum=0, x, j, gasit=0;
    sum=0;
    scanf("%d%d%d%d", &n, &k, &a, &b);
    v[0].push_back(0);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &x);
        sum=(sum+x)%k;
        v[sum].push_back(i);
    }
    for(i=0;i<k;i++)
    {
        for(j=1;j<v[i].size();j++)
        {
            gasit=0;
            int poza, pozb;
            st=0;
            dr=j-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[i][j]-v[i][mij]>=a)
                {
                    poza=mij;
                    gasit=1;
                    st=mij+1;
                }
                else dr=mij-1;
            }
            st=0;
            dr=j-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[i][j]-v[i][mij]<=b)
                {
                    pozb=mij;
                    gasit+=2;
                    dr=mij-1;
                }
                else st=mij+1;
            }
            if(gasit==3)
            sum+=poza-pozb+1;
        }
    }
    printf("%d", sum);
    return 0;
}