poj 3468 A Simple Problem with Integers 【线段树 + 区间更新lazy】

来源:互联网 发布:基因工程中数据分析 编辑:程序博客网 时间:2024/05/17 04:43
A Simple Problem with Integers

Time Limit: 5000MS

 Memory Limit: 131072KTotal Submissions: 71894 Accepted: 22174Case Time Limit: 2000MS

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 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.
 
 
ac:
 
#include<cstdio>#include<cstring>#define MAX 100000+10 using namespace std;long long add[MAX<<2];long long sum[MAX<<2];void PushUp(int o){    sum[o] = sum[o<<1] + sum[o<<1|1];}void PushDown(int o, int m){    if(add[o])    {        add[o<<1]   += add[o];        add[o<<1|1] += add[o];        sum[o<<1]   += add[o] * (m-(m>>1));        sum[o<<1|1] += add[o] * (m>>1);        add[o] = 0;    }}void build(int o, int l, int r){    add[o] = 0;    if(l == r)    {        scanf("%lld", &sum[o]);        return ;    }    int mid = (l + r) >> 1;    build(o<<1, l, mid);    build(o<<1|1, mid+1, r);    PushUp(o);}void update(int o, int l, int r, int L, int R, int v){    if(L <= l && R >= r)    {        add[o] += v;        sum[o] += v * (r-l+1);        return ;    }    PushDown(o,r-l+1);    int mid = (r+l) >> 1;    if(L <= mid)    update(o<<1, l, mid, L ,R, v);    if(R > mid)    update(o<<1|1, mid+1, r, L ,R, v);    PushUp(o);}long long query(int o, int l, int r, int L, int R){    if(L <= l && R >= r)    {        return sum[o];    }    PushDown(o,r-l+1);    int mid = (r+l) >> 1;    long long res = 0;    if(L <= mid)    res += query(o<<1, l, mid, L ,R);    if(R > mid)    res += query(o<<1|1, mid+1, r, L, R);    return res;}int main(){    int n, m;    int a, b, v;    char op[3];    while(scanf("%d%d", &n, &m)!=EOF)    {        build(1, 1, n);        while(m--)        {            scanf("%s",op);            if(op[0] == 'Q')            {                scanf("%d%d", &a, &b);                printf("%lld\n",query(1, 1, n, a ,b));            }            else            {                scanf("%d%d%d", &a, &b, &v);                update(1, 1, n ,a ,b ,v);            }        }    }    return 0;}

0 0
原创粉丝点击