1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std;
const int CN = 1e6 + 5;
int read(){ int s = 0,ne = 1; char c = getchar(); while(c < '0' || c > '9') ne = c == '-' ? -1 : 1, c = getchar(); while(c >= '0' && c <= '9') s = (s << 1) + (s << 3) + c - '0', c = getchar(); return s * ne; }
class SGT { public: int d[CN * 50], ch[CN * 50][2], rt[CN], idx, n, m; #define lc ch[u][0] #define rc ch[u][1] int make() {return ++idx;} int lb(int x) {return x & (-x);} void pmd(int &u, int l, int r, int p, int x){ if(!u) u = make(); if(l == r) return (void)(d[u] += x); int m = (l + r) >> 1; if(p <= m) pmd(lc, l, m, p, x); else pmd(rc, m + 1, r, p, x); d[u] = d[lc] + d[rc]; } void md(int u, int p, int x) {while(u <= m) pmd(rt[u], 1, n, p, x), u += lb(u);} int t1[25], t2[25]; void pqu(int s, int t){ int u = s; t1[0] = 0; while(u) t1[ ++t1[0] ] = rt[u], u -= lb(u); u = t; t2[0] = 0; while(u) t2[ ++t2[0] ] = rt[u], u -= lb(u); } int qu(int l, int r, int s, int t){ if(s <= l && r <= t){ int ans = 0; for(int i = 1; i <= t2[0]; i++) ans += d[ t2[i] ]; for(int i = 1; i <= t1[0]; i++) ans -= d[ t1[i] ]; return ans; } int m = (l + r) >> 1, ans = 0, tmp1[25], tmp2[25]; if(s <= m){ if(m < t) memcpy(tmp1, t1, sizeof(t1)), memcpy(tmp2, t2, sizeof(t2)); for(int i = 1; i <= t1[0]; i++) t1[i] = ch[ t1[i] ][0]; for(int i = 1; i <= t2[0]; i++) t2[i] = ch[ t2[i] ][0]; ans += qu(l, m, s, t); if(m < t) memcpy(t1, tmp1, sizeof(tmp1)), memcpy(t2, tmp2, sizeof(tmp2)); } if(m < t){ for(int i = 1; i <= t1[0]; i++) t1[i] = ch[ t1[i] ][1]; for(int i = 1; i <= t2[0]; i++) t2[i] = ch[ t2[i] ][1]; ans += qu(m + 1, r, s, t); } return ans; } } D;
int n, m, vX[CN], vY[CN], X[CN], Y[CN];
int idx(int x) {return lower_bound(vX + 1, vX + vX[0] + 1, x) - vX;} int idy(int x) {return lower_bound(vY + 1, vY + vY[0] + 1, x) - vY;}
class QU {public: int a, b, c, d;} q[CN];
int main() { freopen("_in.in", "r", stdin);
n = read(), m = read(); for(int i = 1; i <= n; i++) vX[i] = X[i] = read() + 1, vY[i] = Y[i] = read() + 1; vX[0] = vY[0] = n; for(int i = 1; i <= m; i++) vX[ ++vX[0] ] = q[i].a = read() + 1, vY[ ++vY[0] ] = q[i].b = read() + 1, vX[ ++vX[0] ] = q[i].c = read() + 1, vY[ ++vY[0] ] = q[i].d = read() + 1;
sort(vX + 1, vX + vX[0] + 1), sort(vY + 1, vY + vY[0] + 1); int tmp = 1; for(int i = 2; i <= vX[0]; i++) if(vX[i] ^ vX[i - 1]) vX[++tmp] = vX[i]; vX[0] = tmp; tmp = 1; for(int i = 2; i <= vY[0]; i++) if(vY[i] ^ vY[i - 1]) vY[++tmp] = vY[i]; vY[0] = tmp;
D.n = vY[0], D.m = vX[0]; for(int i = 1; i <= n; i++) D.md( idx( X[i] ), idy( Y[i] ), 1);
for(int i = 1; i <= m; i++){ int a = q[i].a, b = q[i].b, c = q[i].c, d = q[i].d; D.pqu(idx(a) - 1, idx(c)), printf("%d", D.qu(1, D.n, idy(b), idy(d))), puts(""); } }
|