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 abc" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q ab" means querying the sum of AaAa+1, ... , Ab.



Output



You need to answer all Q



不要用int,用__int64 或者 long long




#include<stdio.h>
#define maxn 100010

struct node
{
	__int64 val;
	int l,r;
	__int64 add;
}tree[maxn*4];
__int64 num[maxn];

void pushdown(int p)
{
	int m=(tree[p].r-tree[p].l+1);
	if(tree[p].add)
	{
		tree[p<<1].add+=tree[p].add;
		tree[p<<1|1].add+=tree[p].add;
		tree[p<<1].val+=tree[p].add*(m-(m>>1));
		tree[p<<1|1].val+=tree[p].add*(m>>1);
		tree[p].add=0;
	}
}

void build(int p,int l,int r)
{
	tree[p].l=l;
	tree[p].r=r;
	tree[p].add=0;
	if(l==r)
	{
		tree[p].val=num[l-1];
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	tree[p].val=tree[p<<1].val+tree[p<<1|1].val;
}

void update(int p,int l,int r,__int64  val)
{
	if(l<=tree[p].l && r>=tree[p].r)
	{
		tree[p].val+=(__int64 )(tree[p].r-tree[p].l+1)*val;
		tree[p].add+=val;
		return ;
	}
	pushdown(p);
	int mid=(tree[p].r+tree[p].l)>>1;
	if(r<=mid)
	  update(p<<1,l,r,val);
    else if(l>mid)
      update(p<<1|1,l,r,val);
    else
    {
    	update(p<<1,l,mid,val);
    	update(p<<1|1,mid+1,r,val);
    }
    tree[p].val=tree[p<<1].val+tree[p<<1|1].val;
}

__int64  sum;
void query(int p,int l,int r)
{
	if(l<=tree[p].l && r>=tree[p].r)
	{
		sum+=tree[p].val;
		return ;
	}
	pushdown(p);
	int mid=(tree[p].r+tree[p].l)>>1;
	if(r<=mid)
	  query(p<<1,l,r);
    else if(l>mid)
      query(p<<1|1,l,r);
    else
    {
    	query(p<<1,l,mid);
    	query(p<<1|1,mid+1,r);
    }
}

int main()
{
	int n,q;
	while(~scanf("%d%d",&n,&q))
	{
		for(int i=0;i<n;i++)
		  scanf("%I64d",&num[i]);
        build(1,1,n);
        char op[3];
        int x,y;
        long long val;
        while(q--)
        {
        	scanf("%s",op);
        	if(op[0]=='Q')
        	{
	        	scanf("%d%d",&x,&y);
	        	sum=0;
	        	query(1,x,y);
	        	printf("%I64d\n",sum);
	        }
	        else if(op[0]=='C')
	        {
        		scanf("%d%d%I64d",&x,&y,&val);
        		update(1,x,y,val);
        	}
        }
	}
	return 0;
}