题目链接

Description

You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.

The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.

Each of the next Q lines represents an operation.

"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.

"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

10 5

1 2 3 4 5 6 7 8 9 10

Q 4 4

Q 1 10

Q 2 4

C 3 6 3

Q 2 4

Sample Output

4

55

9

15

分析:

首先不考虑原始的情况,我们只考虑区间更新过后带来的影响的话,首先对于询问一个区间当中的元素和的话,肯定就是这个区间的原始的元素和,加上区间更新后所带来的影响,所以我们用a[]数组来保存前i个元素的和。

然后考虑区间更新所带来的影响,采用差分的思想,

设原数组第i位的值为ai,di=ai−a[i−1],则有(这里认为a0=0,此时的a表示的是数组中的原始值,与代码中的a不一样):

所以有:

于是我们得到了:

于是我们把原数组差分后维护两个树状数组,一个维护di,一个维护di×i。

这样区间求和时可以在两个树状数组中查询得到前缀和,区间修改时就是差分数组的修改,每次修改两个点即可。

其中c[i]维护的是d[i],c1[i]维护的是d[i]×i。

但是这里的c[]和c1[]都是差分数组,保存的也就只是更新所带来的值的变化,但因为这里要求的是在原来的基础上更新后的区间和,所以最终还要加上最原始的区间和。

代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
long long int a[510000],c[510000],c1[510000];
int n,k;
int lowbit(int x)
{
return x&(-x);
}
void update(long long int x,long long int val)
{
for(int i=x; i<=n; i+=lowbit(i))
{
c[i]+=val;
c1[i]+=(long long)x*val; //给差分数组中的位置x加上y
}
}
long long sum(long long int x) //查询前x项的和
{
long long ans=0;
for(int i=x; i; i-=lowbit(i))
ans+=(x+1)*c[i]-c1[i];
return ans+a[x];
} int main()
{
char ch;
long long int st,ed,val,num;
while(~scanf("%d%d",&n,&k))
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
memset(c1,0,sizeof(c1));
for(int i=1; i<=n; i++)
{
scanf("%lld",&num);
a[i]+=a[i-1]+num;//a[i]保存的是前i个数的和
}
for(int i=0; i<k; i++)
{
getchar();
scanf("%c",&ch);
if(ch=='Q')
{
scanf("%llld%lld",&st,&ed);
printf("%lld\n",sum(ed)-sum(st-1));
}
else
{
scanf("%lld%lld%lld",&st,&ed,&val);
update(st,val);
update(ed+1,-val);
}
}
}
return 0;
}

最新文章

  1. 配置oozie4.10+hadoop2.5.2
  2. Jquery表单提交后获取返回Json值
  3. 0x00到0xFF二进制数值中1的的个数
  4. Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法
  5. JavaEE EL的一些用法
  6. from 表单提交
  7. HDU 5839 Special Tetrahedron (计算几何)
  8. iOS小结
  9. Jenkins任务启动的后台进程被自动kill
  10. 共享参数ContentProvider 类与数据库绑定,如何通过共享参数测试类,测试数据库的增删改查功能
  11. mina 实例(转载)
  12. 【STM32学习笔记1】基于固件库的STM32_MDK工程模版
  13. RTKLIB编译及RTCM数据读取样例
  14. javascript实现继承3种方式: 原型继承、借用构造函数继承、组合继承,模拟extends方法继承
  15. GameFreamWork框架----事件系统的应用
  16. 有些人表面风光,背地里for循环怎么写都要百度
  17. 【HNOI 2016】大数
  18. 20.Odoo产品分析 (三) – 人力资源板块(1) – 员工目录(1)
  19. EF Core中Fluent Api如何删除指定数据表中的行
  20. TCP相关面试题(转)

热门文章

  1. python安装报错:Microsoft Visual C++ 14.0 is required
  2. sublime 对vue的高亮显示
  3. 关于 WinScp 的一点使用经验
  4. Whitecoin区块链钱包高级功能使用命令
  5. Django 2.0 学习(21):Django Session
  6. Java集合类框架的基本接口有哪些?
  7. Day24-part1-原生Ajax
  8. 【转】ibatis 中isNull, isNotNull与isEmpty, isNotEmpty区别
  9. MT【122】一个重要的不平凡的无穷级数
  10. [洛谷P5216]DLS 采花