Cod sursa(job #197817)

Utilizator AndreyPAndrei Poenaru AndreyP Data 6 iulie 2008 13:00:56
Problema Gropi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100010
int unu[N],doi[N],n,c,m;
bool compar(const int &x,const int &y)
{
	if(x<y)
		return true;
	return false;
}
void preluc()
{
	unu[++unu[0]]=c+1;
	doi[++doi[0]]=c+1;
	unu[++unu[0]]=0;
	doi[++doi[0]]=0;
	sort(unu+1,unu+unu[0]+1,compar);
	sort(doi+1,doi+doi[0]+1,compar);
}
int caut(int x,const int *v)
{
	int p=1,u=v[0],mij;
	if(v[0]==0)
		return 0;
	while(p<u)
	{
		mij=(p+u)>>1;
		if(x<=v[mij])
			u=mij;
		else
			p=mij+1;
	}
	if(p>v[0])
		p=v[0];
	return p;
}
void rezolva()
{
	int x1,y1,x2,y2,pasi=1,x,y;
	bool sens;
	int aux;
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	if((x1==x2)&&(y1==y2))
	{
		printf("0\n");
		return;
	}
	if(y1<y2)
		sens=true;
	else
		sens=false;
	x=x1;
	y=y1;
	if(sens==true)
	{
		while(y!=y2)
		{
			if(x==1)
			{
				aux=caut(y,unu);
				if(aux)
				{
					while((unu[aux]<y)&&(aux<unu[0]))
						aux++;
				}
				if((unu[aux]>y2)||(!aux))
				{
					pasi+=y2-y;
					y=y2;
				}
				else
				{
					pasi+=unu[aux]-y;
					y=unu[aux]-1;
					x=2;
				}
			}
			else
			{
				aux=caut(y,doi);
				if(aux)
				{
					while((doi[aux]<y)&&(aux<doi[0]))
						aux++;
				}
				if((doi[aux]>y2)||(!aux))
				{
					pasi+=y2-y;
					y=y2;
				}
				else
				{
					pasi+=doi[aux]-y;
					y=doi[aux]-1;
					x=1;
				}
			}
		}
	}
	else
	{
		while(y!=y2)
		{
			if(x==1)
			{
				aux=caut(y,unu);
				while((unu[aux]>y)&&(aux>1))
					aux--;
				if((unu[aux]<y2)||(!aux))
				{
					pasi+=y-y2;
					y=y2;
				}
				else
				{
					pasi+=y-unu[aux];
					y=unu[aux]+1;
					x=2;
				}
			}
			else
			{
				aux=caut(y,doi);
				while((doi[aux]>y)&&(aux>1))
					aux--;
				if((doi[aux]<y2)||(!aux))
				{
					pasi+=y-y2;
					y=y2;
				}
				else
				{
					pasi+=y-doi[aux];
					y=doi[aux]+1;
					x=1;
				}
			}
		}
	}
	if(x!=x2)
		pasi++;
	printf("%d\n",pasi);
}
void citire()
{
	int i,x,y;
	scanf("%d%d",&c,&n);
	for(i=0; i<n; i++)
	{
		scanf("%d%d",&x,&y);
		if(x==1)
			unu[++unu[0]]=y;
		else
			doi[++doi[0]]=y;
	}
	preluc();
	scanf("%d",&m);
	for(i=0; i<m; i++)
		rezolva();
}
int main()
{
	freopen("gropi.in","r",stdin);
	freopen("gropi.out","w",stdout);
	citire();
	return 0;
}