Cod sursa(job #197644)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 5 iulie 2008 13:00:44
Problema Gropi Scor 50
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 2.02 kb
#include<stdio.h>
long c,n,m,n1,n2,dist;
int x1,x2;
long y1,y2;
long v1[100003],v2[100003];


long bin1()
{
long st=1,dr=n1;
long m;
while(st<=dr)
	{
	m=(st+dr)>>1;
	if(v1[m]>y1)
		dr=m-1;
	else
		st=m+1;
	}
while(v1[m]>y1)
	m--;
return v1[m+1];
}


long bin2()
{
long st=1,dr=n2;
long m;
m=(st+dr)>>1;
while(st<=dr)
	{
	m=(st+dr)>>1;
	if(v2[m]>y1)
		dr=m-1;
	else
		st=m+1;
	}
while(v2[m]>y1)
	m--;
return v2[m+1];

}


void parcurgere()
{
int i,j;
while(y1<y2)
	{
	if(x1==1)
		{
		y1=bin1()-1;
		if(y1<y2)
			{
			x1++;
			dist++;
			}
		}
	else
		{
		y1=bin2()-1;
		if(y1<y2)
			{
			x1--;
			dist++;
			}
		}
	}
if(x1!=x2)
	dist++;
}


long part1(long st, long dr)
{
long m,pivot,i,j,aux;
m=(st+dr)>>1;
pivot=v1[m];
i=st-1;
j=dr+1;
while(1)
	{
	do{++i;}while(v1[i]<pivot);
	do{--j;}while(v1[j]>pivot);
	if(i<j)
		{
		aux=v1[i];
		v1[i]=v1[j];
		v1[j]=aux;
		}
	else
		return j;
	}
}


void quick1(long st, long dr)
{
long p;
if(st<dr)
	{
	p=part1(st,dr);
	quick1(st,p);
	quick1(p+1,dr);
	}
}


long part2(long st, long dr)
{
long m,pivot,i,j,aux;
m=(st+dr)>>1;
pivot=v2[m];
i=st-1;
j=dr+1;
while(1)
	{
	do{++i;}while(v2[i]<pivot);
	do{--j;}while(v2[j]>pivot);
	if(i<j)
		{
		aux=v2[i];
		v2[i]=v2[j];
		v2[j]=aux;
		}
	else
		return j;
	}
}


void quick2(long st, long dr)
{
long p;
if(st<dr)
	{
	p=part2(st,dr);
	quick2(st,p);
	quick2(p+1,dr);
	}
}


void read()
{
freopen("gropi.in","r",stdin);
freopen("gropi.out","w",stdout);
scanf("%ld%ld",&c,&n);
long i;
for(i=1;i<=n;i++)
	{
	scanf("%d%ld",&x1,&y1);
	if(x1==1)
		v1[++n1]=y1;
	else
		v2[++n2]=y1;
	}
quick1(1,n1);
quick2(1,n2);
v1[++n1]=c+1;
v2[++n2]=c+1;
scanf("%ld",&m);
int x;
long y;
for(i=1;i<=m;i++)
	{
	dist=0;
	scanf("%d%ld%d%ld",&x1,&y1,&x2,&y2);
	if(y2<y1)
		{
		y=y1;
		y1=y2;
		y2=y;
		x=x1;
		x1=x2;
		x2=x;
		}
	dist=y2-y1+1;
	parcurgere();
	printf("%ld\n",dist);
	}
}


int main()
{
read();
return 0;
}