Cod sursa(job #458681)

Utilizator darrenRares Buhai darren Data 25 mai 2010 19:40:27
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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;
		cost += (p2.x == p1.x && (pos2 - pos1) % 2 == 1);
		cost += (p2.x != p1.x && (pos2 - pos1) % 2 == 0);
		
		write();
	}
}

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

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