Cod sursa(job #198448)

Utilizator tvladTataranu Vlad tvlad Data 11 iulie 2008 16:09:10
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <algorithm>
using namespace std;

const int N = 100010;

int n,c,m;
int a[N];
pair<int,int> v[N];

int searcha ( int w ) {
	int st, dr, mij;
	for (st = 0, dr = n-1; st != dr; ) {
		mij = (st+dr)/2;
		if (v[mij].first <= w)
			st = mij+1; else
			dr = mij;
	}
	return st;
}

int searchb ( int w ) {
	int st, dr, mij;
	for (st = 0, dr = n-1; st != dr; ) {
		mij = (st+dr+1)/2;
		if (v[mij].first < w)
			st = mij; else
			dr = mij-1;
	}
	return st;
}

int main() {
	freopen("gropi.in","rt",stdin);
	freopen("gropi.out","wt",stdout);
	scanf("%d %d",&c,&n);
	for (int i = 0; i < n; ++i) scanf("%d %d",&v[i].second,&v[i].first);
	v[n++] = make_pair(0,0);
	v[n++] = make_pair(c+1,0);
	sort(v,v+n);
	a[0] = (v[0].second != v[1].second) ? 1 : 0;
//	printf("(%d,%d) %d\n",v[0].first,v[0].second,a[0]);
	for (int i = 1; i < n-1; ++i) {
		a[i] = a[i-1] + (v[i].second != v[i+1].second);
//		printf("(%d,%d) %d\n",v[i].first,v[i].second,a[i]);
	}
//	printf("(%d,%d)\n",v[n-1].first,v[n-1].second);
	int sy, sx, fy, fx;
	for (scanf("%d",&m); m; --m) {
		scanf("%d %d %d %d",&sy,&sx,&fy,&fx);
		if (sx > fx) {
			sx ^= fx ^= sx ^= fx;
			sy ^= fy ^= sy ^= fy;
		}
//		printf("%d %d %d %d\n",sy,sx,fy,fx);
		int pa = searcha(sx);
		if (v[pa].first >= fx) {
			printf("%d\n",fx-sx + 1 + ((sy != fy) ? 1 : 0));
		} else {
			int pb = searchb(fx);
			int rez = a[pb-1] - a[pa-1];
			rez += (sy == v[pa].second);
			rez += (fy == v[pb].second);
			rez += fx - sx + 1;
			printf("%d\n",rez);
		}
	}
	return 0;
}