Pku3468 A Simple Problem with Integers

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 2173  Solved: 951
[Submit][Status][Discuss]

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

裸题

 #include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdio> #define N 100007
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,q;
char ch[]; #define ls p<<1
#define rs p<<1|1
struct seg
{
ll sum[N<<],add[N<<];
void build(int p,int l,int r)
{
if (l==r)
{
sum[p]=read();
return;
}
int mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
sum[p]=sum[ls]+sum[rs];
}
void push_down(int p,int l,int r)
{
if (!add[p]) return;
ll ad=add[p],mid=(l+r)>>;add[p]=;
sum[ls]+=1ll*(mid-l+)*ad;
sum[rs]+=1ll*(r-mid)*ad;
add[ls]+=ad,add[rs]+=ad;
}
ll query(int p,int l,int r,int x,int y)
{
if (l==x&&y==r) return sum[p];
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) return query(ls,l,mid,x,y);
else if (x>mid) return query(rs,mid+,r,x,y);
else return query(ls,l,mid,x,mid)+query(rs,mid+,r,mid+,y);
}
void modify(int p,int l,int r,int x,int y,int z)
{
sum[p]+=1ll*(y-x+)*z;
if (l==x&&y==r)
{
add[p]+=z;
return;
}
int mid=(l+r)>>;
if (y<=mid) modify(ls,l,mid,x,y,z);
else if (x>mid) modify(rs,mid+,r,x,y,z);
else modify(ls,l,mid,x,mid,z),modify(rs,mid+,r,mid+,y,z);
}
}seg;
#undef ls
#undef rs
int main()
{
n=read(),q=read();
seg.build(,,n);
for (int i=;i<=q;i++)
{
scanf("%s",ch);
if (ch[]=='Q')
{
int x=read(),y=read();
printf("%lld\n",seg.query(,,n,x,y));
}
else
{
int x=read(),y=read(),z=read();
seg.modify(,,n,x,y,z);
}
}
}

最新文章

  1. jQuery图片轮播特效
  2. Xib和storyboard对比
  3. Input gameobject vector3 c#
  4. [HDOJ1043]Eight(康托展开 BFS 打表)
  5. Java 图片提取RGB数组 RGBOfCharMaps (整理)
  6. C#窗体嵌套
  7. 在Ubuntu下编译Assimp库
  8. CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制
  9. bzoj省选十连测推广赛
  10. [Swift]LeetCode173. 二叉搜索树迭代器 | Binary Search Tree Iterator
  11. C# 方法扩展
  12. Python中*args和**kwargs
  13. Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。
  14. ZEOSDBO-7安装
  15. Linux nmap命令详解
  16. 持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成]
  17. 【译】Spark调优
  18. 关于安装时无法重启rabbitmq服务
  19. &quot;strcmp()&quot; Anyone? UVA - 11732(trie出现的次数)
  20. linux下运行telnet命令出现command not find解决办法

热门文章

  1. Python版本切换和Pip安装
  2. n! 阶乘
  3. ffmpeg实现mjpeg摄像头的采集-预览-拍照
  4. python学习摘要(2)--基本数据类型
  5. eg_2
  6. WinForm连续点击按钮只打开一次窗体
  7. 累积下学习 C#时和 Java时的不同点
  8. [剑指Offer] 39.平衡二叉树
  9. Windows7系统目录迁移:Users,Progr…
  10. springBoot按条件装配:Condition