Cod sursa(job #197741)

Utilizator AndreyPAndrei Poenaru AndreyP Data 5 iulie 2008 17:38:19
Problema Gropi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100010
int unu[N],doi[N],n,c,m,x1,x2,y1,y2;
char ca[35];
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 parsare()
{
	int aux[6],i,care=-1,aux1=0;
	fgets(ca,35,stdin);
	for(i=0; ca[i]!='\0'; i++)
	{
		if((ca[i]>='0')&&(ca[i]<='9'))
			aux1=aux1*10+ca[i]-'0';
		else
		{
			aux[++care]=aux1;
			aux1=0;
		}
	}
	x1=aux[0];
	y1=aux[1];
	x2=aux[2];
	y2=aux[3];
}
void rezolva()
{
	int pasi=1,x,y;
	bool sens;
	int aux;
	//scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	parsare();
	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,y,j;
	scanf("%d%d\n",&c,&n);
	for(i=0; i<n; i++)
	{
		//scanf("%d%d",&x,&y);
		fgets(ca,35,stdin);
		y=0;
		for(j=2; ca[j]!='\n'; j++)
			y=y*10+ca[j]-'0';
		if(ca[0]=='1')
			unu[++unu[0]]=y;
		else
			doi[++doi[0]]=y;
	}
	preluc();
	scanf("%d\n",&m);
	for(i=0; i<m; i++)
		rezolva();
}
int main()
{
	freopen("gropi.in","r",stdin);
	freopen("gropi.out","w",stdout);
	citire();
	return 0;
}