AcWing 802. 区间和-java
原题链接
简单
作者:
硬拉tom
,
2020-09-22 00:39:40
,
所有人可见
,
阅读 406
java 代码
import java.util.*;
public class Main{
static int N=300010;
static int[] a=new int[N];
static int[] s=new int[N];
static List<int[]> adds=new ArrayList<>();
static List<int[]> querys=new ArrayList<>();
static List<Integer> ids=new ArrayList<>();
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
for(int i=0;i<n;i++){
int x=sc.nextInt();
int c=sc.nextInt();
adds.add(new int[]{x,c});
ids.add(x);
}
for(int i=0;i<m;i++){
int l=sc.nextInt(),r=sc.nextInt();
ids.add(l);
ids.add(r);
querys.add(new int[]{l,r});
}
Collections.sort(ids);
int j=0;
for(int i=1;i<ids.size();i++){
if(ids.get(i)!=ids.get(j)){
ids.set(++j,ids.get(i));
}
}
for(int i=ids.size()-1;i>j;i--){
ids.remove(ids.size()-1);
}
for(int[] t:adds){
int x=find(t[0]);
int c=t[1];
a[x]+=c;
}
for(int i=1;i<=ids.size();i++){
s[i]=s[i-1]+a[i];
}
for(int[] t:querys){
int l=find(t[0]);
int r=find(t[1]);
System.out.println(s[r]-s[l-1]+" ");
}
}
static int find(int x){
int l=0,r=ids.size()-1,mid;
while(l<r){
mid=l+(r-l)/2;
if(ids.get(mid) < x){
l=mid+1;
}else{
r=mid;
}
}
return l+1;
}
}