update和query
import java.util.*;
public class Solution{
Map<Integer,Integer> tree=new HashMap<>();
Map<Integer,Integer> mark=new HashMap<>();
int LEFT=1;
int RIGHT=10;
public static void main(String[] args){
Solution test=new Solution();
test.update(1,10,1,1,test.LEFT,test.RIGHT);
int res=test.query(2,4,1,test.LEFT,test.RIGHT);
System.out.println(res);
}
private void pushDown(int p,int len){
if(len<=1){
return;
}
tree.put(2*p,tree.getOrDefault(2*p,0)+mark.getOrDefault(p,0)*(len-len/2));
mark.put(2*p,mark.getOrDefault(2*p,0)+mark.getOrDefault(p,0));
tree.put(2*p+1,tree.getOrDefault(2*p+1,0)+mark.getOrDefault(p,0)*len/2);
mark.put(2*p+1,mark.getOrDefault(2*p+1,0)+mark.getOrDefault(p,0));
mark.put(p,0);
}
public void update(int l,int r,int d,int p,int left,int right){
if(left>r||right<l){
return;
}
if(l<=left&&r>=right){
tree.put(p,tree.getOrDefault(p,0)+d*(right-left+1));
mark.put(p,mark.getOrDefault(p,0)+d);
}else{
pushDown(p,right-left+1);
int mid=(left+right)/2;
update(l,r,d,2*p,left,mid);
update(l,r,d,2*p+1,mid+1,right);
tree.put(p,tree.get(2*p)+tree.get(2*p+1));
}
}
public int query(int l,int r,int p,int left,int right){
if(left>r||right<l){
return 0;
}
if(l<=left&&r>=right){
return tree.getOrDefault(p,0);
}else{
pushDown(p,right-left+1);
int mid=(left+right)/2;
return query(l,r,2*p,left,mid)+query(l,r,2*p+1,mid+1,right);
}
}
}