Cod sursa(job #458677)

Utilizator darrenRares Buhai darren Data 25 mai 2010 19:20:57
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<fstream>
#include<algorithm>
using namespace std;

typedef struct { int x, y; } point;
bool cmp(point p1, point p2)
{
	return p1.y < p2.y;
}

void read();
void write();
int lower(point p);

int n, c, m;
point g[100001];
int itv[100001], t, cost;

ofstream fout("gropi.out");
int main()
{
	read();
	return 0;
}

void read()
{
	ifstream fin("gropi.in");
	fin >> c >> n;
	for (int i = 1; i <= n; ++i)
		fin >> g[i].x >> g[i].y;
	
	sort(g + 1, g + n + 1, cmp);
	
	itv[++t] = 0;
	int aux = 0;
	for (int i = 1; i <= n; ++i)
		if (g[i].x != aux)
		{
			itv[++t] = g[i].y;
			aux = g[i].x;
		}
		
	fin >> m;
	point p1, p2;
	for (int i = 1; i <= m;	++i)
	{
		fin >> p1.x >> p1.y >> p2.x >> p2.y; 
		if (p1.y > p2.y)
			swap(p1, p2);
		int pos1 = lower(p1);
		int pos2 = lower(p2);
		
		cost = pos2 - pos1 + p2.y - p1.y + 1;
		
		if (p2.x == p1.x)
			if ((pos2 - pos1) % 2 == 1)
				++cost;
		if (p2.x != p1.x)
			if ((pos2 - pos1) % 2 == 0)
				++cost;
		write();
	}
}

void write()
{
	fout << cost << '\n';
}

int lower(point p)
{
	int l1 = 1, l2 = t;
	while (l1 <= l2)
	{
		int md = (l1 + l2) >> 1;
		
		if (itv[md] < p.y)
			l1 = md + 1;
		else
			l2 = md - 1;
	}
	return l2;
}