poj3511--A Simple Problem with Integers(线段树求和)

来源:互联网 发布:全民k歌刷花软件 编辑:程序博客网 时间:2024/04/30 11:37

A Simple Problem with Integers
Time Limit: 5000MS Memory Limit: 131072KTotal Submissions: 60441 Accepted: 18421Case 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 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4

Sample Output

455915

Hint

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

将一段的值增加c 求一段的和

将线段树的每一段表示它代表的那一段的和,统计结果时,要记录一段的所有的父节点的和,对该段会有影响


#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 100000#define LL __int64#define lmin 1#define rmax n#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define now l,r,rt#define int_now LL l,LL r,LL rtLL cl[maxn<<2] , lazy[maxn<<2];void push_up(int_now){    cl[rt] = cl[rt<<1] + cl[rt<<1|1] + (r-l+1)*lazy[rt] ;}void push_down(int_now){}void creat(int_now){    cl[rt] = lazy[rt] = 0 ;    if(l != r)    {        creat(lson);        creat(rson);        push_up(now);    }    else        scanf("%I64d", &cl[rt]);}void update(LL ll,LL rr,LL x,int_now){    if( ll > r || rr < l )        return ;    if( ll <= l && r <= rr )    {        lazy[rt] += x ;        cl[rt] += (r-l+1)*x ;        return ;    }    update(ll,rr,x,lson);    update(ll,rr,x,rson);    push_up(now);}LL query(LL ll,LL rr,int_now,LL add){    if( ll > r || rr < l )        return 0;    if( ll <= l && r <= rr )        return cl[rt] + ( r-l+1 )*add ;    push_down(now);    return query(ll,rr,lson,add+lazy[rt]) + query(ll,rr,rson,add+lazy[rt]) ;}int main(){    LL i , j , x , n , m ;    char str[10] ;    while(scanf("%I64d %I64d", &n, &m) !=EOF)    {        creat(root);        while(m--)        {            scanf("%s", str);            if(str[0] == 'C')            {                scanf("%I64d %I64d %I64d", &i, &j, &x);                update(i,j,x,root);            }            else            {                scanf("%I64d %I64d", &i, &j);                printf("%I64d\n", query(i,j,root,0));            }        }    }    return 0;}


0 0
原创粉丝点击