Cod sursa(job #197822)

Utilizator AndreyPAndrei Poenaru AndreyP Data 6 iulie 2008 16:14:45
Problema Gropi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100010
#define x first
#define y second
pair<int, int> v[N];
int s[N],n,m,c;
int caut1(int x)
{
	int p=0,u=n-1,mij;
	while(p!=u)
	{
		mij=(p+u)>>1;
		if(v[mij].x<=x)
			p=mij+1;
		else
			u=mij;
	}
	return p;
}
int caut2(int x)
{
	int p=0,u=n-1,mij;
	while(p!=u)
	{
		mij=(p+u+1)>>1;
		if(v[mij].x<x)
			p=mij;
		else
			u=mij-1;
	}
	return p;
}
void rezolva()
{
	pair<int, int> a,b;
	int poz1,poz2;
	scanf("%d%d%d%d",&a.y,&a.x,&b.y,&b.x);
	if(a>b)
		swap(a,b);
	poz1=caut1(a.x);
	if(b.x<=v[poz1].x)
		printf("%d\n",b.x-a.x+1+(a.y!=b.y));
	else
	{
		poz2=caut2(b.x);
		int pasi=s[poz2-1]-s[poz1-1];
		if(a.y==v[poz1].y)
			pasi++;
		if(b.y==v[poz2].y)
			pasi++;
		pasi+=b.x-a.x+1;
		printf("%d\n",pasi);
	}
}
void citire()
{
	scanf("%d%d",&c,&n);
	int i;
	for(i=0; i<n; i++)
		scanf("%d%d",&v[i].y,&v[i].x);
	v[n++].x=v[n].y=0;
	v[n++].x=c+1;
	v[n].y=0;
	sort(v,v+n+2);
	s[0]=v[0].y!=v[1].y;
	for(i=1; i+1<n; i++)
		s[i]=s[i-1]+(v[i].y!=v[i+1].y);
	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;
}