Pagini recente » Cod sursa (job #5225) | Cod sursa (job #1103682) | Cod sursa (job #858886) | Cod sursa (job #1076215) | Cod sursa (job #1608722)
#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 ) << '\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;
}