poj3468

来源:互联网 发布:淘宝客网站开发 编辑:程序博客网 时间:2024/05/30 22:54

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
4559

15

AC代码:

#include<iostream>#include<algorithm>#include<stdio.h>#include<cstdio>#include<string.h>#include<cstring>#include<queue>#include<vector>#include<cmath>#include<stack>#include<set>#include<map>#define lson l,mid,ro<<1#define rson mid+1,r,ro<<1|1using namespace std;const int N=1e5+10;const int mod=9973;typedef long long ll;struct node{        int l,r;        ll sum;        ll val;}tr[N*4];ll a[N];void build(int l,int r,int ro){        tr[ro].l=l;        tr[ro].r=r;        tr[ro].val=0;        if(l==r)        {                tr[ro].sum=a[l];                return ;        }        int mid=(l+r)/2;        build(lson);        build(rson);        tr[ro].sum=tr[ro<<1].sum+tr[ro<<1|1].sum;}void add(int a,int b,int ro,ll val){        if(a<=tr[ro].l&&b>=tr[ro].r)        {                tr[ro].val+=val;                return ;        }        else if(a>=tr[ro].l&&b<=tr[ro].r)        {                tr[ro].sum+=(b-a+1)*val;        }        else if(a<=tr[ro].l&&b<=tr[ro].r)        {                tr[ro].sum+=(b-tr[ro].l+1)*val;        }        else if(a>=tr[ro].l&&b>=tr[ro].r)        {                tr[ro].sum+=(tr[ro].r-a+1)*val;        }        int mid=(tr[ro].l+tr[ro].r)/2;        if(a<=mid)                add(a,b,ro<<1,val);        if(b>mid)                add(a,b,ro<<1|1,val);}ll sum;void query(int a,int b,int ro){        if(a<=tr[ro].l&&b>=tr[ro].r)        {                sum+=tr[ro].sum+tr[ro].val*(tr[ro].r-tr[ro].l+1);                return ;        }        else        {                tr[ro<<1].val+=tr[ro].val;                tr[ro<<1|1].val+=tr[ro].val;                tr[ro].sum+=tr[ro].val*(tr[ro].r-tr[ro].l+1);                tr[ro].val=0;        }        int mid=(tr[ro].l+tr[ro].r)/2;        if(a<=mid)                query(a,b,ro<<1);        if(b>mid)                query(a,b,ro<<1|1);}int main(){        int n,q;        while(scanf("%d%d",&n,&q)!=EOF)        {                for(int i=1;i<=n;i++)                        scanf("%lld",&a[i]);                build(1,n,1);                while(q--)                {                        char ch;                        cin>>ch;                        int a,b;                        scanf("%d%d",&a,&b);                        if(ch=='Q')                        {                                sum=0;                                query(a,b,1);                                printf("%lld\n",sum);                        }                        else if(ch=='C')                        {                                ll val;                                scanf("%lld",&val);                                add(a,b,1,val);                        }                }        }}


原创粉丝点击