Cod sursa(job #206434)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 6 septembrie 2008 18:10:22
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define x first
#define y second
#define mp make_pair

int n, c, m;
pair<int, int> v[100005];
int s[100005];

int caut1(int X) 
{
	int st = 0, dr = n - 1, mij;
	while (st != dr) {
		mij = (st + dr) / 2;
		if (v[mij].x <= X) st = mij + 1;
		else dr = mij;
	}
	return st;
}

int caut2(int X)
{
	int st = 0, dr = n - 1, mij;
	while (st != dr) {
		mij = (st + dr + 1) / 2;
		if (v[mij].x < X) st = mij;
		else dr = mij - 1;
	}
	return st;
}

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

	int i, p1, p2, rez;
	scanf("%d %d", &c, &n);

	for (i = 0; i < n; ++i)	scanf("%d %d", &v[i].y, &v[i].x);

	v[n++] = mp(0, 0);
	v[n++] = mp(c + 1, 0);

	sort(v, v + n);

	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);
	while (m--)
	{
		pair<int, int> a, b;

		scanf("%d %d %d %d", &a.y, &a.x, &b.y, &b.x);
		if (b < a) swap(a, b);

		p1 = caut1(a.x);
		if (v[p1].x >= b.x)	printf("%d\n", b.x-a.x + 1 + (a.y != b.y));
		else 
		{
			p2 = caut2(b.x);
			rez = s[p2 - 1] - s[p1 - 1];

			if (a.y == v[p1].y) ++rez;
			if (b.y == v[p2].y) ++rez;

			rez += b.x - a.x + 1;
			printf("%d\n", rez);
		}
	}
	return 0;
}