版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30986521/article/details/82662221
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define N 500005
struct node
{
int x, y;
int id;
bool friend operator < (const node a, const node b)
{
if (a.x == b.x)
{
return a.y < b.y;
}
return a.x < b.x;
}
}q[N], p[N];
int r[N * 3 + 10], l[N * 3 + 10];
int lowBit(int x)
{
return x & -x;
}
int get_sum(int *a, int k)
{
int sum = 0;
while (k)
{
sum += a[k];
k -= lowBit(k);
}
return sum;
}
void update(int *a, int k, int delta)
{
while (k <= N)
{
a[k] += delta;
k += lowBit(k);
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
int ans[N];
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &q[i].x, &q[i].y);
}
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &p[i].x, &p[i].y);
p[i].id = i;
}
sort(q + 1, q + 1 + n);
sort(p + 1, p + 1 + m);
memset(r, 0, sizeof(l));
memset(l, 0, sizeof(r));
for (int i = 1; i <= n; i++)
{
update(r, q[i].y + 1, 1);
}
int px, py;
int j = 1;
for (int i = 1; i <= m; i++)
{
px = p[i].x;
py = p[i].y;
while (j <= n)
{
if (q[j].x > px)
{
int r_cnt = get_sum(r, N) - get_sum(r, py + 1) + get_sum(l, py + 1);
int l_cnt = n -r_cnt;
ans[p[i].id] = abs(r_cnt - l_cnt);
break;
}
update(l, q[j].y + 1, 1);
update(r, q[j].y + 1, -1);
j++;
}
}
for (int k = 1; k <= m; k++)
{
printf("%d\n", ans[k]);
}
putchar(10);
}
return 0;
}