Cod sursa(job #197575)

Utilizator crusRus Cristian crus Data 5 iulie 2008 10:52:39
Problema Gropi Scor 0
Compilator c Status done
Runda Junior Challenge 2008 Marime 1.5 kb
#include <stdio.h>
#define cmax 500
#define input "gropi.in"
#define output "gropi.out"
long x[cmax],y[cmax],x1[cmax],x2[cmax],y1[cmax],y2[cmax];
long c,l,col,m,i,p,lung,xi,xf,yi,yf,n,aux,k;
void merge(long ls,long ld)
{
 int k,i1,i2,k1,k2,i;
 if (ls<ld)
    {
     k=(ls+ld)/2;
     merge(ls,k);
     merge(k+1,ld);
     k1=0; k2=0;
     for (i=ls;i<=k;i++)
	 {k1++; x1[k1]=x[i]; y1[k1]=y[i];}
     for (i=k+1;i<=ld;i++)
	 {k2++; x2[k2]=x[i]; y2[k2]=y[i];}
     i1=1; i2=1; k=ls-1;
     while (i1<=k1 && i2<=k2)
	   if (y1[i1]<y2[i2])
	      {k++; y[k]=y1[i1]; x[k]=x1[i1]; i1++;}
	   else
	      {k++; y[k]=y2[i2]; x[k]=x2[i2]; i2++;}
     while (i1<=k1)
	   {k++; y[k]=y1[i1]; x[k]=x1[i1]; i1++;}
     while (i2<=k2)
	   {k++; y[k]=y2[i2]; x[k]=x2[i2]; i2++;}
    }
}
int main()
{
 freopen(input,"r",stdin);
 freopen(output,"w",stdout);
 scanf("%ld %ld",&c,&m);
 for (i=1;i<=m;i++)
     scanf("%ld %ld",&x[i],&y[i]);
 merge(1,m);
 scanf("%ld",&n);
 for (p=1;p<=n;p++)
     {
      scanf("%ld %ld %ld %ld",&xi,&yi,&xf,&yf);
      if (yi>yf)
	 {aux=xi; xi=xf; xf=aux; aux=yi; yi=yf; yf=aux;}
      lung=1;
      l=xi; col=yi; k=1;

      while (col<=yf)
	     if (y[k]<col) k++;
		else
	     if (y[k]>col && y[k]<=yf)
		{
		 lung+=y[k]-col;
		 col=y[k];
		 if (x[k]==l)
		    {l=3-x[k]; lung++;}
		 k++;
		}
		else
	     if (y[k]>col && y[k]>yf)
		{
		 lung+=yf-col;
		 col=yf+1;
		 if (xf!=l)
		    {l=3-xf; lung++;}
		}
      printf("%ld\n",lung);
     }
 return 0;
}