Cod sursa(job #247703)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 23 ianuarie 2009 19:36:25
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#include<stdlib.h>
#define NMAX 500001

struct el{int r,p;};
int n;
el v[NMAX];

void poz(int st,int dr,int &piv){
int i=st,j=dr,d=0;
el t;
while(i<j){
	if(v[i].r>v[j].r||v[i].r==v[j].r&&v[i].p>v[j].p)
		{t=v[i];v[i]=v[j];v[j]=t;d=1-d;}
	i+=d;j-=1-d;
	}
piv=i;
}

void qsrt(int li,int ls){
int piv;
if(li<ls){
	poz(li,ls,piv);
	qsrt(li,piv-1);
	qsrt(piv+1,ls);
	}
}

int main(){
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
int i,j,nrs=0,k,a,b,x,d,k5,st,end;
char sir[20],*p;
scanf("%d%d%d%d\n",&n,&k,&a,&b);
k5=10*k;
for(i=1;i<=n;++i){
	v[i].p=i;
	fgets(sir,20,stdin);
	x=0;p=sir;
	while(*p!='\n'&&*p) x=10*x+(*p-48),p++;
	v[i].r=v[i-1].r+x;
	/*if(v[i].r>=k5)*/ v[i].r=v[i].r%k;
   //	else while(v[i].r>=k) v[i].r-=k;
	}
qsrt(1,n);
i=0;st=i;
while(i<n){
	while(v[i].r!=v[i+1].r) goto gogo;
	if(st<i)st=i;
	while(st<n&&v[st].r==v[i].r&&v[st].p-v[i].p<a) st++;
	if(st==n){end=st+1;goto iar;}
	j=st;
	while(j<n&&v[j].r==v[i].r&&v[j].p-v[st].p<b) j++;
	if(j<=n&&v[j].p-v[st].p<=b) {end=j;goto iar;}
	/*
	while(v[j].r==v[i].r){
		d=v[j].p-v[i].p;

		if(d>b) {end=j;break;}
		//if(d==a) st=j;
		++j;
		}     */
	iar:
	nrs+=end-st;
	gogo:
	i++;
	}
printf("%d",nrs);
return 0;
}