Cod sursa(job #199350)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 18 iulie 2008 01:13:59
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>

int c, n, m, v1[100000], v2[100000], n1, n2;

void swap(int &x, int &y)
{
	int t = x; x = y; y = t;
}

int search(int v[], int x, int n)
{
	int p, u, m;
	p = 1; u = n; m = (p + u) / 2;
	while (p <= u)
	{
		if (v[m] > x && (!v[m-1] || v[m-1] < x)) return v[m];
		else if (v[m - 1] > x) u = m - 1;
		else if (v[m] < x) p = m + 1;
		m = (p + u) / 2;
	}
	return 0;
}

int main()
{
	freopen("gropi.in","r",stdin);
	freopen("gropi.out","w",stdout);

	int i, x1, x2, y1, y2, d, ok, p;

	scanf("%d",&c);
	scanf("%d",&n);

	for (i = 1; i <= n; i++)
	{
		scanf("%d %d",&x1,&x2);
		if (x1 == 1) v1[++n1] = x2;
		else v2[++n2] = x2;
	}

	scanf("%d",&m);
	for (i = 1; i <= m; i++)
	{
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
		if (y1 > y2) { swap(x1,x2); swap(y1,y2);}

		//d = y2 - y1 + 1;
		ok = x1; p = y1;
		d = 1;

		while (p < y2)
		{
			if (ok == 1)
			{
				n = search(v1, p, n1);
				if (n && n <= y2)
				{
					d += n - p;
					p = n - 1;
					ok = 2;
				}
				else { d += y2 - p; p = y2; }
			}
			else
			{
				n = search(v2, p, n2);
				if (n && n <= y2)
				{
					d += n - p;
					p = n - 1;
					ok = 1;
				}
				else { d += y2 - p; p = y2; }
			}
		}
                if (ok != x2) d++;
		printf("%d\n",d);
	}
	return 0;
}