http://codevs.cn/problem/1082/

【AC】

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=2e5+2;
 5 int n;
 6 ll a[maxn];
 7 ll c1[maxn];
 8 ll c2[maxn];
 9 int lowbit(int x)
10 {
11     return x&-x;
12 }
13 void add(ll *c,int k,ll val)
14 {
15     while(k<=n){
16         c[k]+=val;
17         k+=lowbit(k);
18     }
19 }
20 ll query(ll *c,int k)
21 {
22     ll ans=0;
23     while(k)
24     {
25         ans+=c[k];
26         k-=lowbit(k);
27     }
28     return ans;
29 }
30 ll solve(int x)
31 {
32     ll ans=0;
33     ans+=x*query(c1,x);
34     ans-=query(c2,x);
35     return ans; 
36 }
37 ll solve(int x,int y)
38 {
39     return solve(y)-solve(x-1); 
40 }
41 int main()
42 {
43     while(~scanf("%d",&n))
44     {
45         a[0]=0;
46         for(int i=1;i<=n;i++)
47         {
48             scanf("%I64d",&a[i]);
49         //    cout<<a[i]<<endl;
50             add(c1,i,a[i]-a[i-1]);
51             add(c2,i,(i-1)*(a[i]-a[i-1]));
52         } 
53         int q;
54         scanf("%d",&q);
55         int tp;
56         while(q--)
57         {
58             scanf("%d",&tp);
59             if(tp==1)
60             {
61                 int x,y;ll val;
62                 scanf("%d%d%I64d",&x,&y,&val);    
63                 add(c1,x,val);
64                 add(c1,y+1,-val);
65                 add(c2,x,1ll*(x-1)*val);
66                 add(c2,y+1,-1ll*y*val);
67             }
68             else
69             {
70                 int x,y;
71                 scanf("%d%d",&x,&y);
72                 ll ans=solve(x,y);
73                 printf("%I64d\n",ans);
74             }
75         }
76     }
77     return 0;
78 }
View Code

相关文章: