Cod sursa(job #458849)

Utilizator darrenRares Buhai darren Data 26 mai 2010 17:16:27
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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 = new point[100001];
point itv[100001];
int t = 1, 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);
	
	int aux = 0;
	for (int i = 1; i <= n; ++i)
		if (g[i].x != aux)
		{
			itv[++t].y = g[i].y;
			itv[t].x = g[i].x;
			aux = g[i].x;
		}
	delete[] g;
		
	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);
		pos1 += (pos1 == 1 && itv[2].y == 1);
		pos2 += (pos2 == 1 && itv[2].y == 1);
		
		cost = pos2 - pos1 + p2.y - p1.y + 1;
		cost += (itv[pos1].x == p1.x);
		cost += (itv[pos2].x == p2.x);
		cost -= ((itv[pos1].y == 1 || itv[pos1].y == 0) && itv[pos2].y != itv[pos1].y && p1.x != itv[pos1 + 1].x);
		
		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].y < p.y ? md + 1 : l1;
		l2 = itv[md].y >= p.y ? md - 1 : l2;
	}
	if (l2 == 0)
		++l2;
	return l2;
}