Pagini recente » Cod sursa (job #2823049) | Cod sursa (job #743363) | Cod sursa (job #1907705) | Cod sursa (job #1840328) | Cod sursa (job #458849)
Cod sursa(job #458849)
#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;
}