数列操作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;
}