Pagini recente » Cod sursa (job #1766336) | Cod sursa (job #532266) | Cod sursa (job #2157384) | Cod sursa (job #3140986) | Cod sursa (job #2422815)
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define buff_size 104576
char buff[buff_size];
int pos = 0;
inline void read(int &nr) {
while(!isdigit(buff[pos]))
if(++pos == buff_size)
fread(buff, 1, buff_size, stdin), pos = 0;
nr = 0;
while(isdigit(buff[pos])) {
nr = (nr << 1) + (nr << 3) + buff[pos] - 48;
if(++pos == buff_size)
fread(buff, 1, buff_size, stdin), pos = 0;
}
}
const int N = 100000 + 7;
int c, n;
int x[N], y[N];
int ty[N];
int w[N], taki = 0;
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;
}
struct info {
int y, i;
};
info a[N];
bool cmp1(info a, info b) {
return a.y < b.y;
}
bool cmp2(info a, info b) {
return a.i < b.i;
}
char outBuff[buff_size];
int outPtr;
inline void putChar(const char &C) {
outBuff[outPtr++] = C;
if (outPtr == buff_size) {
fwrite(outBuff, 1, buff_size, stdout);
outPtr = 0;
}
}
inline void write(int X) {
static char digs[10];
int n = 0, q;
do {
q = X / 10;
digs[n++] = X - (q << 1) - (q << 3) + 48;
X = q;
} while (X);
while (n--) {
putChar(digs[n]);
}
putChar(' ');
}
int main() {
freopen("gropi.in", "r", stdin);
freopen("gropi.out", "w", stdout);
read(c);
read(n);
for(int i = 1; i <= n; i++) {
read(x[i]);
read(a[i].y);
a[i].i = i;
}
sort(a + 1, a + n + 1, cmp1);
for(int i = 1; i <= n; i++) {
if(a[i].y != a[i - 1].y)
w[++taki] = a[i].y,
a[i].y = taki;
}
sort(a + 1, a + n + 1, cmp2);
for(int i = 1; i <= n; i++) {
ty[a[i].y] += x[i];
}
int rumba = 0;
for(int i = 1; i <= taki; i++) {
rumba += (ty[i] != ty[i - 1]);
ch[i] = rumba;
}
int q;
read(q);
for(int jj = 1; jj <= q; jj++) {
int r1, c1, r2, c2;
read(r1);
read(c1);
read(r2);
read(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);
}
write(dst);
putChar('\n');
}
fwrite(outBuff, 1, outPtr, stdout);
return 0;
}