Cod sursa(job #1608729)

Utilizator felixiPuscasu Felix felixi Data 22 februarie 2016 12:19:04
Problema Gropi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream in("gropi.in");
ofstream out("gropi.out");

const int NMAX = 2000000;
const int GMAX = 100000;

int C,N,Q;
vector < pair<int,short int> > v;
vector < int > d;

int LOOKRIGHT( int val ) {
	int last = 0;
	int st = 0, dr = N-1;
	while( st <= dr ) {
		int mid = (st + dr) / 2;
		if( val <= v[mid].first ) {
			last = mid;
			dr = mid-1;
		}
		else {
			st = mid+1;
		}
	}
	return last;
}

int LOOKLEFT( int val ) {
	int last = N-1;
	int st = 0, dr = N-1;
	while( st <= dr ) {
		int mid = (st + dr) / 2;
		if( v[mid].first <= val ) {
			last = mid;
			st = mid + 1;
		}
		else {
			dr = mid - 1;
		}
	}
	return last;
}

int DIST( int x, int y, pair<int,int> A, int semn ) {
    int vert = (A.first - x) * semn;
    vert = max( vert, 0 );
    int oriz = max( y - A.second , A.second  - y );
    return vert + oriz;
}

int main()
{
	in >> C >> N;
	for( int i = 0;  i < N;  ++i ) {
		int x,y;
		in >> y >> x;
		y = 3 - y;
		v.push_back( make_pair(x,y) );
	}
	sort( v.begin(), v.end() );
	d.push_back( 0 );
	for( int i = 1;  i < N;  ++i ) {
		int dist = v[i].first - v[i-1].first;
		dist += max(v[i].second - v[i-1].second, v[i-1].second - v[i].second);
		d.push_back( dist + d[i-1] );
	}

	in >> Q;
	for( int q = 0;  q < Q;  ++q ) {
		int x,y,a,b;
		in >> y >> x >> b >> a;
		if( x > a ) {
			swap( a,x );
			swap( b,y );
		}
		int st = LOOKRIGHT( x );
		int dr = LOOKLEFT( a );
		if( st > dr ) {
            out << a - x + max( b-y, y-b ) + 1 << '\n';
            continue;
		}
		out << DIST( x,y, v[st], 1 ) + max(0, d[dr] - d[st]) + DIST( a,b, v[dr], -1 ) + 1;
		out <<'\n';
	}
	return 0;
}