A Simple Problem with Integers
Time Limit: 5000MS   Memory Limit: 131072K
Total Submissions: 59046   Accepted: 17974
Case Time Limit: 2000MS

Description

You have N integers, A1A2, ... , 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 A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.

Each of the next Q lines represents an operation.

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

"Q a b" means querying the sum of AaAa+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

Hint

The sums may exceed the range of 32-bit integers.

Source

/*
区间更新的lazy操作。
*/
#include <stdio.h> struct node
{
int l, r;
__int64 sum;
__int64 lazy; //当成段更新时,往往不用更新到单个的点。lazy操作大大节省了时间。
}tree[300005];
int h[100005];
__int64 sum; //int超限 void build(int l, int r, int n)
{
int mid;
tree[n].l = l;
tree[n].r = r;
tree[n].lazy = 0; //赋初值
if(l==r)
{
tree[n].sum = h[l];
return ;
}
mid = (l+r)/2;
build(l, mid, 2*n);
build(mid+1, r, 2*n+1); tree[n].sum = tree[2*n].sum+tree[2*n+1].sum;
}
void add(int l, int r, __int64 k, int n)
{
int mid;
if(tree[n].l==l && tree[n].r==r) //当须要更新的段 与 结点相应的段吻合时,直接把此结点的lazy值更新就可以,不须要再向下更新。
{
tree[n].lazy += k;
return;
} tree[n].sum += k*(r-l+1); //当此区间包括须要更新的区间,但不吻合时,须要向下继续查找,此时须要更新这个父节点的sum值。 mid = (tree[n].l + tree[n].r)/2;
if(r <= mid)
add(l, r, k, 2*n);
else if(l >=mid+1)
add(l, r, k, 2*n+1);
else
{
add(l, mid, k, 2*n);
add(mid+1, r, k, 2*n+1);
}
}
void qu(int l, int r, int n)
{
int mid;
if(tree[n].l==l && tree[n].r==r)
{
sum += tree[n].sum + (r-l+1)*tree[n].lazy; //当查找的段与 此结点的段吻合时,sum 值等于这个结点的sum加上lazy乘区间长度的值。
return ;
} if(tree[n].lazy!=0 && tree[n].l!=tree[n].r) //当查找区间为此结点相应区间的子集时,须要将此结点相应的lazy值下放到其子节点,并把此结点的lazy值置为0。
{
add(tree[2*n].l, tree[2*n].r, tree[n].lazy, n);
add(tree[2*n+1].l, tree[2*n+1].r, tree[n].lazy, n);
tree[n].lazy = 0;
}
mid = (tree[n].l + tree[n].r)/2; if(l >= mid+1)
qu(l, r, 2*n+1);
else if(r <= mid)
qu(l, r, 2*n);
else
{
qu(l, mid, 2*n);
qu(mid+1, r, 2*n+1);
}
} int main()
{
int n, q;
int i;
int a, b, c;
char ch[10]; scanf("%d%d", &n, &q);
for(i=1; i<=n; i++)
scanf("%d", &h[i]); build(1, n, 1);
while(q--)
{
scanf("%s", ch);
if(ch[0]=='Q')
{
scanf("%d%d", &a, &b);
sum = 0;
qu(a, b, 1);
printf("%I64d\n", sum);
}
else
{
scanf("%d%d%d", &a, &b, &c);
add(a, b, c, 1);
}
}
return 0;
}

POJ 3468 A Simple Problem with Integers //线段树的成段更新的更多相关文章

  1. POJ3648 A Simple Problem with Integers(线段树之成段更新。入门题)

    A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 53169 Acc ...

  2. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  3. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  4. poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解

    A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...

  5. [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  6. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  7. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  8. poj 3468 A Simple Problem with Integers 线段树加延迟标记

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  9. poj 3468 A Simple Problem with Integers 线段树区间更新

    id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072 ...

随机推荐

  1. 程序员实用的 MySQL sql 语句

    这儿只讲究实用,  程序员编程时常用到的 MySQL的 sql语句(不包括基本的 select, update, delete 等语句). 1. 添加一个用户build,并赋予所有权限的命令 gran ...

  2. iOS、mac开源项目及库(感谢原作者的分享)

    目录 模糊效果 富文本 表相关 HUD与Toast 其他UI 其他动画 网络测试 网络聊天 Model 数据库 PDF 摄像照相视频音频处理 消息相关 消息推送服务器端 版本新API的Demo 测试及 ...

  3. 调用有道翻译API

    前两天朋友说起NASA开放了数据API,今儿突然想起从来没用过外部提供的API,然而简单用得多的貌似是有道词典API,就像试试,本来觉得应该挺简单的,用urllib模块很快就实现了. 不过测试时才发现 ...

  4. <httpProtocol/>配置http协议头

    Web.Config中的位置 <configuration> <system.webServer> <httpProtocol> <!--http协议内容-- ...

  5. windows server 2003 AD

    本文转载:http://www.cnblogs.com/zfanlong1314/admin/EditPosts.aspx?opt=1 今天教大家用windows server2003系统建立Acti ...

  6. Swift 字符串连接

    // 使用+直接相加 var i = var str = "Hello" str = str + " jinpangpang" // 可以使用这种方式连接整值 ...

  7. centos6.7下 编译安装MySQL5.7

    centos6.7下编译安装MySQL5.7 准备工作 #-----依赖包及MySQL和boost安装包----- #yum包安装: shell> yum -y install gcc-c++ ...

  8. ECSTORE导航吸顶功能

    ecstore导航吸顶功能,在导航父元素中加入id,如: <div id="mainNav1"></div> 在footer.html中添加以下js代码: ...

  9. MySQL按照汉字的拼音排序(转)

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  10. IE6双倍margin间距解决方法

    虽然现在很少有人在用ie6了,但作为前端人员,是不的不面对的问题. 在ie6中,使用float后的元素,在margin—left,这是你会发现距离和你想的不一样,其他的浏览器又是正常的,增大margi ...