树状数组-数列操作b

数列操作b

测试点已过,有没有一些缩短时间的修改方法

题目描述:
假设有一列数 {Ai }(1 ≤ i ≤ n),n<=100000 ,支持如下两种操作:
(1)将 A i至A j 的值均增加 D 。( i,j,D 是输入的数)
(2) 输出 Ai 。( i是输入的数, i ≤ n )

输入格式:
输入文件第一行一个整数 n ,
第二行为 n 个整数,表示 {A i } 的初始值。
第三行为一个整数 m ,表示操作数。 下接 m 行,每行描述一个操作,有如下两种情况:
ADD i j d ( 表示将 A i至A j 的值均增加 D , 1<=i,j<=n , d 为整数 )
QUERY s (表示输出 A s)

输出格式:
对于每一个 QUERY 提问,输出结果

样例:
样例输入
4
1 4 2 3
3
QUERY 1
ADD 2 2 50
QUERY 2
样例输出
1
54

#include<iostream>
#define lowbit(x) (x&(-x))

using namespace std;

int n,m,a[1000001],b[1000010],c[1000010];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) for(int j=i;j<=n;j+=lowbit(j)) c[j]+=a[i];
    cin>>m;
    for(int i=1;i<=m;i++){
        string p;
        cin>>p;
        if(p=="ADD"){
            int i,j,number;
            cin>>i>>j>>number;
            for(int k=i;k<=n;k+=lowbit(k)) c[k]+=number;
            for(int k=i;k<=j;k++) a[k]+=number;
        }
        if(p=="QUERY"){
            int index;
            cin>>index;
            b[1]=0;
            for(int i=1;i<=n;i++)
                b[i]=a[i]-a[i-1];
            int sum=0;
            for(int i=1;i<=index;i++) sum+=b[i];
            cout<<sum<<endl;
        }
    }
    return 0;
}