Cod sursa(job #498084)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 3 noiembrie 2010 23:04:43
Problema Divk Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
# include <fstream.h>
ifstream f ("divk.in");
ofstream g ("divk.out");
long long int i,j,n,k,la,lb,s[500100],x,y;



  struct nod 
  {
	  int info;
	  nod *urm;
  }*a[100010],*p,*q;
  
   void adauga (long long int x,long long int i)
   {
	   p=new nod;
	   p->info=x;
	   p->urm=a[i];
	   a[i]=p;
   }
	 
    long long int calc (nod *p,long long int lim)
  {
	 long long int nr=0,i=1,j=2;
   q=p->urm;
   while (p && q)
   {
     if (q->info-p->info<=lim)
		 nr=nr+(j-i)-1;
		 
	 
      while (q)
	  {
        if (q->info-p->info<=lim)
         {
			 nr++;
		q=q->urm;
		j++;
	     }
		else
			break;
		
	  }
	  
	  p=p->urm;
	  i++;
	  
   }
   
   while (p)
   {
     q=p->urm;
	 
      while (q)
	  {
        if (q->info-p->info<=lim)
          	nr++;
		else
			break;
		q=q->urm;
	  }
	  p=p->urm;
   }

   
   
return nr;   

	 
     
  }	 

   
   int asd (long long int lim)
   {
	   int nr=0;
	   for (i=0;i<k;i++)
		   if (a[i])
		   nr=nr+calc(a[i],lim);
	   return nr;
   }
		   

 

int main ()
{
	f>>n>>k>>la>>lb;
	for (i=1;i<=n;i++)
	{
		f>>x;
	
		s[i]=s[i-1]+x;
	}
	
	for (i=n;i>=1;i--)
		adauga (i,s[i]%k);
	p=new nod;
	p->info=0;
	p->urm=a[0];
	a[0]=p;
	
	x=asd (lb);
	y=asd (la-1);
	g<<x-y;
	
	return 0;
}