Cod sursa(job #344259)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 29 august 2009 14:37:05
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#define Nmax 500010

int A,B,n,k,i,z,zs,zf,nr;
int a[Nmax],poz[Nmax];

void sort(int l,int r){
	int xa,xp,y,i,j;
   i=l; j=r; xa=a[l+(r-l)/2]; xp=poz[l+(r-l)/2];
   do{
   	while(a[i] < xa || (a[i]==xa && poz[i] < xp)) i++;
      while(xa < a[j] || (a[j]==xa && xp < poz[j])) j--;
      if(i<=j){
      	y=a[i]; a[i]=a[j]; a[j]=y;
         y=poz[i]; poz[i]=poz[j]; poz[j]=y;
         i++; j--;
      }
   } while(i<=j);
   if(i<r) sort(i,r);
   if(l<j) sort(l,j);
}

int main(){
	freopen("divk.in","r",stdin);
   freopen("divk.out","w",stdout);
   scanf("%d%d%d%d",&n,&k,&A,&B);
	for(i=1;i<=n;++i){
   		scanf("%d",&a[i]);
   		a[i] =(a[i-1]+a[i])% k;
         poz[i]=i;
   }

   sort(1,n);

   for(i=1,zs=zf=2; i<=n; ++i){
   	while(poz[zs]-poz[i] <A && a[zs]==a[i] && zs<=n) zs++;
      while(poz[zf]-poz[i] <=B && a[zf]==a[i] && zf<=n) zf++;
      nr += zf-zs;
      if(a[i]==0 && A<=poz[i] && poz[i]<=B) nr++;
   }

   printf("%d\n",nr);
   fclose(stdin); fclose(stdout);
   return 0;
}