import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Node{
int left;
int right;
long value;
long add;
}
public class Main {
static int[] w ;
static Node[] tree;
static BufferedReader br;
static int n , m ;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
n = Integer.parseInt(s[0]);
m = Integer.parseInt(s[1]);
w = new int[n+1];
tree = new Node[n<<2];
s = br.readLine().split(" ");
for(int i = 1; i<= n ; i++) w[i] = Integer.parseInt(s[i-1]);
// init();
Build(1,1,n);
while(m-->0){
s = br.readLine().split(" ");
if(s[0].equals("Q")){
int para1 = Integer.parseInt(s[1]);
int para2 = Integer.parseInt(s[2]);
long ans = Query(1,para1,para2);
System.out.println(ans);
}else{
int para1 = Integer.parseInt(s[1]);
int para2 = Integer.parseInt(s[2]);
int para3 = Integer.parseInt(s[3]);
Updata(1,para1,para2,para3);
}
}
}
private static void Updata(int p, int left, int right, int add) {
// TODO Auto-generated method stub
if(tree[p].left==left && tree[p].right==right){
tree[p].add+=add;
return;
}
tree[p].value += (right-left+1)*add; // 更新父节点值,不需要再pushup
int mid=(tree[p].left+tree[p].right)>>1;
if(right<=mid)
Updata(p<<1,left,right,add);
else if(left>=mid+1)
Updata(p<<1|1,left,right,add);
else{
Updata(p<<1,left,mid,add);
Updata(p<<1|1,mid+1,right,add);
}
}
private static long Query(int p, int left, int right) {
// TODO Auto-generated method stub
int len=tree[p].right-tree[p].left+1;
if(tree[p].left==left && tree[p].right==right)
return tree[p].value+tree[p].add*len;
else{
tree[p<<1].add+=tree[p].add;
tree[p<<1|1].add+=tree[p].add;
tree[p].value+=len*tree[p].add;
tree[p].add=0;
}
int mid=(tree[p].left+tree[p].right)>>1;
if(right<=mid)
return Query(p<<1,left,right);
else if(left>=mid+1)
return Query(p<<1|1,left,right);
else
return Query(p<<1,left,mid)+Query(p<<1|1,mid+1,right);
}
private static void Build(int p, int left, int right) {
// TODO Auto-generated method stub
//System.out.println(p);
tree[p]=new Node();
tree[p].left=left;
tree[p].right=right;
tree[p].add=0;
if(left==right){
tree[p].value=w[left];
return;
}
int mid=(left+right)>>1;
Build(p<<1,left,mid);
Build(p<<1|1,mid+1,right);
tree[p].value=tree[p<<1].value+tree[p<<1|1].value;
}
}
线段树模板题:POJ 3468 a simple problem with integers Java 模板
于 2022-04-07 15:26:10 首次发布