Pagini recente » Cod sursa (job #194835) | Cod sursa (job #832212) | Cod sursa (job #2893917) | Cod sursa (job #1972678) | Cod sursa (job #2422788)
#include <map>
#include <cstdio>
#include <map>
#include <set>
#include <iostream>
using namespace std;
const int N = 100000 + 7;
int c, n;
int x[N], y[N];
int ty[N];
int w[N], taki = 0;
map <int, int> rrr;
int ch[N];
int after(int p) {
int l = 1, r = taki;
int a = -1;
while(l <= r) {
int m = (l + r) / 2;
if(p <= w[m]) {
a = m;
r = m - 1;
} else {
l = m + 1;
}
}
return a;
}
int before(int p) {
int l = 1, r = taki;
int a = -1;
while(l <= r) {
int m = (l + r) / 2;
if(w[m] <= p) {
a = m;
l = m + 1;
} else {
r = m - 1;
}
}
return a;
}
int main() {
freopen("gropi.in", "r", stdin);
freopen("gropi.out", "w", stdout);
cin >> c >> n;
set<int>ys;
for(int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
ys.insert(y[i]);
}
for(auto &x : ys)
w[++taki] = x, rrr[w[taki]] = taki;
for(int i = 1; i <= n; i++) {
y[i] = rrr[y[i]];
ty[y[i]] += x[i];
}
int rumba = 0;
for(int i = 1; i <= taki; i++) {
rumba += (ty[i] != ty[i - 1]);
ch[i] = rumba;
}
int q;
cin >> q;
while(q--) {
int r1, c1, r2, c2;
cin >> r1 >> c1 >> r2 >> c2;
if(c1 > c2) {
swap(c1, c2);
swap(r1, r2);
}
int dst = c2 - c1 + 1;
int p1 = after(c1 + 1);
int p2 = before(c2 - 1);
if(p1 != -1 && p2 != -1 && p1 <= p2) {
dst += ch[p2] - ch[p1];
dst += (ty[p1] == r1);
dst += (ty[p2] == r2);
} else {
dst += (r1 != r2);
}
cout << dst << "\n";
}
return 0;
}