Cod sursa(job #197793)

Utilizator vlad.maneaVlad Manea vlad.manea Data 6 iulie 2008 10:08:23
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>

#define nmax 100005

int X[nmax], Y[nmax], X2[nmax], Y2[nmax], r[nmax];

int suma[nmax];

int C, N, M, xi, xf, yi, yf, st, dr, ans;

void msort(int l, int r)
{
	int i, j, k;

	if (l >= r) return;

	int m = (l+r)>>1;

	msort(l, m);
	msort(m+1, r);

	for (i = k = l, j = m+1; i <= m && j <= r;)
	{
		if (X[i] < X[j])
		{
			X2[k] = X[i];
			Y2[k++] = Y[i++];
		}
		else
		{
			X2[k] = X[j];
			Y2[k++] = Y[j++];
		}
	}

	for (; i <= m; X2[k] = X[i], Y2[k] = Y[i], ++i, ++k);
	for (; j <= r; X2[k] = X[j], Y2[k] = Y[j], ++j, ++k);
	for (k = l; k <= r; X[k] = X2[k], Y[k] = Y2[k], ++k);
}

void binary_left(int v, int l, int r, int &st)
{
	if (l > r)
		return;

	int m = (l+r)>>1;

	if (v <= X[m])
	{
		st = m;
		binary_left(v, l, m-1, st);
	}
	else
		binary_left(v, m+1, r, st);
}

void binary_rite(int v, int l, int r, int &dr)
{
	if (l > r)
		return;

	int m = (l+r)>>1;

	if (v >= X[m])
	{
		dr = m;
		binary_rite(v, m+1, r, dr);
	}
	else
		binary_rite(v, l, m-1, dr);
}

int main()
{
	int i;

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

	scanf("%d%d", &C, &N);

	for (i = 1; i <= N; ++i)
		scanf("%d%d", &Y[i], &X[i]);

	msort(1, N);

	// micsorez numarul de chestii identice
	for (i = 2; i <= N; ++i)
		if (Y[i] == Y[i-1])
		{
			r[i] = 1;
			r[0]++;
		}

	for (i = ans = 1; i <= N; ++i)
		if (r[i] == 0)
		{
			X[ans] = X[i];
			Y[ans] = Y[i];
			++ans;
		}

	for (i = 2, N = N-r[0]; i <= N; ++i)
		suma[i] = suma[i-1] + (X[i]-X[i-1]) + 1;

	scanf("%d", &M);

	for (i = 1; i <= M; ++i)
	{
		scanf("%d%d%d%d", &yi, &xi, &yf, &xf);
		if (xi > xf)
		{
			ans = xi; xi = xf; xf = ans;
			ans = yi; yi = yf; yf = ans;
		}

		st = dr = ans = 0;
		binary_left(xi, 1, N, st);
		binary_rite(xf, 1, N, dr);

		if (X[st] <= xf && xi <= X[dr] && st && dr)
		{
			ans += X[st]-xi + (Y[st] == yi);
			ans += xf-X[dr] + (Y[dr] == yf);
			ans += suma[dr]-suma[st];
		}
		else
			ans = xf-xi + (yf != yi);

		ans++;

		printf("%d\n", ans);
	}

	return 0;
}