ACWING 802 区间和
#include <bits/stdc++.h>
using namespace std;
const int N = 300010;
using PII = pair<int, int>;
int a[N]; //离散化后坐标点上的值
int s[N]; //离散化后坐标点上的前缀和
vector<PII> add, query;
vector<int> all; //储存离散化映射
int n, m;
int find(int x) {
//从坐标映射到a[]和s[]中
int l = 0, r = all.size() - 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (all[mid] == x) {
return mid + 1; //a和s从1开始存放
}
else if (all[mid] < x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return -1;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("D:/VS CODE/C++/in.txt", "r", stdin);
freopen("D:/VS CODE/C++/out.txt", "w", stdout);
#endif
cin >> n >> m;
for (int i = 0; i < n; ++i) {
int x, c;
scanf("%d %d", &x, &c);
add.push_back({
x, c});
all.push_back(x);
}
for (int i = 0; i < m; ++i) {
int l, r;
scanf("%d %d", &l, &r);
query.push_back({
l, r});
all.push_back(l);
all.push_back(r);
}
sort(all.begin(), all.end()); //将all进行排序
all.erase(unique(all.begin(), all.end()), all.end());
//使用unique函数对all容器相邻元素进行去重
//unique返回值是去重后容器中最后一个元素的下一个位置
int cnt = 0;
for (auto item : add) {
a[find(item.first)] += item.second;
++cnt;
}
for (int i = 1; i <= all.size(); ++i) {
//求前缀和
s[i] += s[i - 1] + a[i];
}
for (auto item : query) {
int l = find(item.first), r = find(item.second);
cout << s[r] - s[l - 1] << endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}