` #include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII; //数对 type-类型 define-定义 pair-一对
const int N=300010;
int a[N],s[N];//分别用来存储数轴上的数,及前缀和
vector<PII> adds,query;//分别存储题目中的下标x的数进行+c操作和查询操作
vector<int> indexes;//存储所有操作涉及到的下标,对这些不连续下标进行离散化
int find(int x)//简单的二分查找,寻找元素对应的下标
{
int n=indexes.size();
int l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(indexes[mid]>=x) r=mid;
else l=mid+1;
}
return l+1; // 映射到1, 2, ...n
}
int main()
{
int n,m;
cin>>n>>m;
while (n -- )
{
int x,c;
cin>>x>>c;
indexes.push_back(x);//存储adds操作相关下标
adds.push_back({x,c});//记录adds操作
}
while(m--)
{
int l,r;
cin>>l>>r;
//indexes.push_back(l);
//indexes.push_back(r);//存储query操作相关下标
query.push_back({l,r});//记录query操作
}
//进行离散化
sort(indexes.begin(),indexes.end());
indexes.erase(unique(indexes.begin(),indexes.end()),indexes.end());//[**先排序,在去重; erase()擦除使用unique()后无意义的部分**](https://blog.csdn.net/sandalphon4869/article/details/98209093)
for(auto ad:adds)//进行加c操作
{
int x=find(ad.first);//找到原下标对应的离散值
int value=ad.second;//存储adds操作的value
a[x]+=value;//在一个新的连续数组上存储原不连续数组元素的值
}
for(int i=1;i<=indexes.size();i++)//求前缀和
{
s[i]=s[i-1]+a[i];
}
for(auto q:query)
{
int l=find(q.first);//将查询的区间转化为对应的离散化之后的区间
int r=find(q.second);
cout<<s[r]-s[l-1]<<endl;
}
return 0;
}`