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 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
思路
水题。。。水起来
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int N=100000+5;
int a[N],n,m;
struct node
{
long long sum,flag;
node *lson,*rson;
void pushdown(int lf,int rg)
{
if (flag)
{
int mid=(lf+rg)>>1;
lson->flag+=flag;
lson->sum+=(long long)flag*(mid-lf+1);
rson->flag+=flag;
rson->sum+=(long long)flag*(rg-mid);
flag=0;
}
}
void update()
{
sum=lson->sum+rson->sum;
}
};
struct node dizhi[400005],*tail=dizhi,*root;
node *build(int lf,int rg)
{
node *nd=++tail;
if (lf==rg)
{
nd->sum=a[lf];
nd->flag=0;
}
else
{
int mid=(lf+rg)>>1;
nd->lson=build(lf,mid);
nd->rson=build(mid+1,rg);
nd->sum=nd->lson->sum+nd->rson->sum;
nd->flag=0;
}
return nd;
}
void modify(node *nd,int lf,int rg,int L,int R,int delta)
{
if (L<=lf&&rg<=R)
{
nd->sum+=(long long)(rg-lf+1)*delta;
nd->flag+=delta;
return ;
}
nd->pushdown(lf,rg);
int mid=(lf+rg)>>1;
if (L<=mid) modify(nd->lson,lf,mid,L,R,delta);
if (R>mid) modify(nd->rson,mid+1,rg,L,R,delta);
nd->update();
}
long long query(node *nd,int lf,int rg,int L,int R)
{
if (L<=lf&&rg<=R) return nd->sum;
int mid=(lf+rg)>>1;
nd->pushdown(lf,rg);
long long rt=0;
if (L<=mid) rt+=query(nd->lson,lf,mid,L,R);
if (R>mid) rt+=query(nd->rson,mid+1,rg,L,R);
nd->update();
return rt;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
root=build(1,n);
while(m--)
{
char s[105];
scanf("%s",s);
if (s[0]=='C')
{
int L,R,delta;
scanf("%d%d%d",&L,&R,&delta);
modify(root,1,n,L,R,delta);
}
else
{
int L,R;
scanf("%d%d",&L,&R);
printf("%I64d\n",query(root,1,n,L,R));
}
}
return 0;
}