Cod sursa(job #197808)

Utilizator AndreyPAndrei Poenaru AndreyP Data 6 iulie 2008 12:15:21
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100010
int c,n,cate=-1,m;
struct abc
{
	int x,y;
};
abc total[N];
bool compar(const abc &x,const abc &y)
{
	if(x.y<y.y)
		return true;
	return false;
}
void preluc(abc *t)
{
	int i,ant=0;
	for(i=1; i<=n; i++)
	{
		if(t[i].x!=ant)
		{
			total[++cate].x=ant;
			total[cate].y=t[i].y-1;
			ant=t[i].x;
		}
	}
	total[++cate].x=ant;
	total[cate].y=c;
	total[0].x=total[0].y=total[++cate].x=0;
	total[cate].y=c+1;
	cate--;
}
int caut(int y)
{
	int p=1,u=cate,mij;
	while(p<u)
	{
		mij=(p+u)>>1;
		if(y<=total[mij].y)
			u=mij;
		else
			p=mij+1;
	}
	if(p>cate)
		p=cate;
	if(total[p].y<y)
		p++;
	return p;
}
void rezolva()
{
	int x1,y1,x2,y2,poz1,poz2,pasi=0,aux;
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	if(y1==y2)
	{
		if(x1==x2)
		{
			printf("0\n");
			return;
		}
		printf("2\n");
		return;
	}
	poz1=caut(y1);
	if(poz1==0)
		poz1=1;
	if(poz1>cate)
		poz1=cate;
	poz2=caut(y2);
	if(poz2==0)
		poz2=1;
	if(poz2>cate)
		poz2=cate;
	if(x1==total[poz1].x)
		pasi++;
	if(x2==total[poz2].x)
		pasi++;
	aux=y2-y1;
	if(aux<0)
		aux=-aux;
	pasi+=aux+1;
	aux=poz1-poz2;
	if(aux<0)
		aux=-aux;
	pasi+=aux;
	printf("%d\n",pasi);
}
void citire()
{
	int i;
	abc t[N];
	scanf("%d%d",&c,&n);
	for(i=1; i<=n; i++)
		scanf("%d%d",&t[i].x,&t[i].y);
	sort(t+1,t+n+1,compar);
	preluc(t);
	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;
}