显示原始代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 5;
#define lowbit(x) ((x) & -(x))
int tree[N + 1000] = { 0 };
int n, m;
void add(int x, int d) {
while (x <= N) {
tree[x] += d;
x += lowbit(x);
}
}
int ask(int x) {
int ans = 0;
while (x > 0) {
ans += tree[x];
x -= lowbit(x);
}
return ans;
}
struct node {
int g, f, id;
} a[200005], b[200005];
bool cmpb(node x, node y) {
if (x.g == y.g)
return x.f < y.f;
return x.g < y.g;
}
bool cmpa(node x, node y) {
if (x.f == y.f)
return x.g < y.g;
return x.f < y.f;
}
int ans[N];
vector<int> alls;
int find(int x) {
int l = 0, r = alls.size() - 1;
while (l < r) {
int mid = l + r >> 1;
if (alls[mid] >= x)
r = mid;
else
l = mid + 1;
}
return r + 1;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
scanf("%lld", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld%lld", &a[i].g, &a[i].f);
alls.push_back(a[i].g), alls.push_back(a[i].f);
a[i].id = i;
}
scanf("%lld", &m);
for (int i = 1; i <= m; i++) {
scanf("%lld%lld", &b[i].g, &b[i].f);
alls.push_back(b[i].g), alls.push_back(b[i].f);
b[i].id = i;
}
sort(alls.begin(), alls.end());
alls.erase(unique(alls.begin(), alls.end()), alls.end());
sort(a + 1, a + 1 + n, cmpa);
sort(b + 1, b + 1 + m, cmpb);
int j = 1;
for (int i = 1; i <= m; i++) {
while (j <= n && a[j].f <= b[i].g) {
add(find(a[j].g), 1);
j++;
}
ans[b[i].id] = ask(find(b[i].f));
}
for (int i = 1; i <= m; i++) printf("%lld\n", ans[i]);
}