Cod sursa(job #197551)

Utilizator wefgefAndrei Grigorean wefgef Data 4 iulie 2008 23:40:59
Problema Gropi Scor Ascuns
Compilator cpp Status done
Runda Marime 1.29 kb
#include <cstdio>
#include <algorithm>
using namespace std;

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

const int MAX_N = 100005;

int N, C;
pair<int, int> v[MAX_N];
int S[MAX_N];

int search1(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 search2(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);

	scanf("%d %d", &C, &N);
	for (int 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 (int i = 1; i + 1 < N; ++i)
		S[i] = S[i-1] + (v[i].y != v[i+1].y);

	int M;
	for (scanf("%d", &M); M; --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);

		int p1 = search1(A.x);
		if (v[p1].x >= B.x)
			printf("%d\n", B.x-A.x + 1 + (A.y != B.y));
		else {
			int p2 = search2(B.x);
			int ret = S[p2-1] - S[p1-1];
			if (A.y == v[p1].y) ++ret;
			if (B.y == v[p2].y) ++ret;
			ret += B.x-A.x+1;
			printf("%d\n", ret);
		}
	}
}