AcWing 802. 区间和
原题链接
简单
作者:
_cc
,
2021-02-23 15:38:57
,
所有人可见
,
阅读 259
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N=300010;
int n,m,a[N],s[N];
vector<int> alls;
vector<PII> add,lr;
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;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
int x,c;
scanf("%d%d",&x,&c);
alls.push_back(x);
add.push_back({x,c});
}
for(int i=0;i<m;i++){
int l,r;
scanf("%d%d",&l,&r);
alls.push_back(l);
alls.push_back(r);
lr.push_back({l,r});
}
//去重
sort(alls.begin(),alls.end());
alls.erase(unique(alls.begin(),alls.end()),alls.end());
//将值给a数组
for(auto y:add){
int x=find(y.first);
a[x]+=y.second;
}
//求s[i]区间和
for(int i=0;i<=alls.size();i++) s[i]=s[i-1]+a[i];
//每次查找l和r在alls的位置,return r+1返回的位置就成了数组a的位置,然后在输出前缀和
for(auto z:lr){
int l=find(z.first),r=find(z.second);
printf("%d\n",s[r]-s[l-1]);
}
return 0;
}