假定有一个无限长的数轴,数轴上每个坐标上的数都是0。
现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。
接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。
输入格式
第一行包含两个整数n和m。
接下来 n 行,每行包含两个整数x和c。
再接下里 m 行,每行包含两个整数l和r。
输出格式
共m行,每行输出一个询问中所求的区间内数字和。
数据范围
−109≤x≤109, 1≤n,m≤105, −109≤l≤r≤109, −10000≤c≤10000
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5
这是我的代码:
#include<bits/stdc++.h>
using namespace std;
vector<int>Spot;
queue<pair<int,int>>Team;
unordered_map<int,int>Axis;
int cnt,n,m,p[1000001],x[100001],c[100001],a[100001],l,r;
int Discretization(int x){//离散化
if(!Axis.count(x)){
cnt++;
Axis[x]=cnt;
}return Axis[x];
}bool cmp(int i,int j){return i<j;}//排序函数
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x[i]>>c[i];
Spot.push_back(x[i]);
}for(int i=1;i<=m;i++){
cin>>l>>r;
Team.push({l,r});
Spot.push_back(l);
Spot.push_back(r);
}sort(Spot.begin(),Spot.end(),cmp);
for(int i=1;i<=Spot.size();i++) Discretization(Spot[i]);
for(int i=1;i<=n;i++){//计算前缀和
int k=Discretization(x[i]);
a[k]+=c[i];
}for(int i=1;i<=cnt;i++) p[i]=p[i-1]+a[i];
for(int i=1;i<=m;i++){
pair<int,int>section;
section=Team.front();
Team.pop();
cout<<p[Discretization(section.second)]-p[Discretization(section.first)-1]<<endl;
}return 0;
}