YXC的代码是不是麻烦了,二分查找,小于等于x最大的数。这样就不用把查询的坐标也离散化了。加一个哨兵防止,l小于离散化中最小的数导致二分查找不到。
C++ 代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
pair<int,int> a[N],b[N];
int request(pair<int,int> *a,int l,int r,int x){
while(l<r){
int mid = (l+r+1)/2;
if(a[mid].first>x)r = mid - 1;
else l = mid;
}
return a[l].second;
}
int main(){
int n,m,k;
cin>>n>>m;
for(int i = 1;i <= n;i++) scanf("%d%d",&a[i].first,&a[i].second);
sort(a+1,a+1+n);
for(int i = 1,j = 0;i<=n;i++){
if(i==1||a[i].first!=a[i-1].first)
b[++j] = a[i];
else b[j].second+=a[i].second;
k = j;
}
b[0].first = -1e9-1;
for(int i = 1;i <= k;i++) b[i].second+=b[i-1].second;
while(m--){
int l,r;
cin>>l>>r;
cout<<request(b,0,k,r) - request(b,0,k,l-1)<<endl;
}
}