题意很明确,一个区间,给定2种操作
1、给[s,e]加上一个数
2、询问[s,e]的和
线段树写的有点搓,其实没必要搞那么复杂,还是采取标记下移就可以了。。郁闷
1 import java.io.*;
2 public class Main {
3
4 /**
5 * @param args
6 */
7 static class node
8 {
9 int s,e;
10 long add=0;
11 long sum=0;
12 }
13 static node st[]=new node[400000];
14 static void init(int s,int e,int pos)
15 {
16 st[pos].s=s;
17 st[pos].e=e;
18 if(e!=s+1)
19 {
20 init(s,(s+e)>>1,pos<<1);
21 init((s+e)>>1,e,(pos<<1)+1);
22 }
23 }
24 static void add(int s,int e,long add,int pos)
25 {
26 if(st[pos].s==s&&st[pos].e==e)
27 {
28 st[pos].add+=add;
29 st[pos].sum+=add*(e-s);
30 }
31 else
32 {
33 int mid=(st[pos].s+st[pos].e)>>1;
34 if(e<=mid)
35 add(s,e,add,pos<<1);
36 else if(s>=mid)
37 add(s,e,add,(pos<<1)+1);
38 else
39 {
40 add(s,mid,add,pos<<1);
41 add(mid,e,add,(pos<<1)+1);
42 }
43 st[pos].sum=st[pos<<1].sum+st[(pos<<1)+1].sum+st[pos].add*(st[pos].e-st[pos].s);
44 }
45 }
46 static long getsum(int s,int e,int pos)
47 {
48 if(st[pos].s==s&&st[pos].e==e)
49 return st[pos].sum;
50 else
51 {
52 int mid=(st[pos].s+st[pos].e)>>1;
53 if(e<=mid)
54 return getsum(s,e,pos<<1)+st[pos].add*(e-s);
55 else if(s>=mid)
56 return getsum(s,e,(pos<<1)+1)+st[pos].add*(e-s);
57 else
58 return getsum(s,mid,pos<<1)+getsum(mid,e,(pos<<1)+1)+st[pos].add*(e-s);
59 }
60 }
61 public static void main(String[] args) throws Exception{
62 StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
63 for(int i=0;i<400000;i++)
64 st[i]=new node();
65 int n,q;
66 in.nextToken();
67 n=(int)in.nval;
68 in.nextToken();
69 q=(int)in.nval;
70 init(1,n+1,1);
71 for(int i=1;i<=n;i++)
72 {
73 in.nextToken();
74 add(i,i+1,(long)in.nval,1);
75 }
76 for(int i=1;i<=q;i++)
77 {
78 in.nextToken();
79 String jud=in.sval;
80 in.nextToken();
81 int a=(int)in.nval;
82 in.nextToken();
83 int b=(int)in.nval;
84 switch(jud.charAt(0))
85 {
86 case 'Q':
87 System.out.println(getsum(Math.min(a, b),Math.max(a, b)+1,1));
88 break;
89 case 'C':
90 in.nextToken();
91 add(Math.min(a, b),Math.max(a,b)+1,(long)in.nval,1);
92 break;
93 }
94 }
95
96 }
97
98 }
99