链接:
https://www.nowcoder.com/acm/contest/77/H
来源:牛客网
来源:牛客网
题目描述
You have
N
integers,
A
1
,
A
2
, ... ,
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.
输入描述:
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.
输出描述:
You need to answer all Q commands in order. One answer in a line.
#include<bits/stdc++.h>
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
#define ll long long
const int maxn=1e5+7;
ll a[maxn],add[maxn<<2];
struct node
{
int left,right,mid;
ll sum;
}c[maxn<<2];
void build(int l,int r,int rt)
{
add[rt]=0;
c[rt].left=l;
c[rt].right=r;
c[rt].mid=(l+r)>>1;
if(l==r)
{
c[rt].sum=a[l];
return;
}
build(l,c[rt].mid,lson);
build(c[rt].mid+1,r,rson);
c[rt].sum=c[lson].sum+c[rson].sum;
}
void Push_down(int rt)
{
if(add[rt]!=0)
{
add[lson]+=add[rt];
add[rson]+=add[rt];
//这里注意,add[lson],add[rson]此时不一定已经更新了,
//因此是在原来的基础上加,不是直接赋值
c[lson].sum+=(c[lson].right-c[lson].left+1)*add[rt];
c[rson].sum+=(c[rson].right-c[rson].left+1)*add[rt];
add[rt]=0;
}
}
void update(int l,int r,ll C,int rt)
{
if(l<=c[rt].left&&r>=c[rt].right)
{
add[rt]+=C;
c[rt].sum+=(c[rt].right-c[rt].left+1)*C;
return;
}
Push_down(rt);
if(l<=c[rt].mid)update(l,r,C,lson);
if(r>c[rt].mid)update(l,r,C,rson);
c[rt].sum=c[lson].sum+c[rson].sum;
}
ll query(int l,int r,int rt)
{
if(l<=c[rt].left&&r>=c[rt].right)
{
return c[rt].sum;
}
Push_down(rt);
int m=(c[rt].left+c[rt].right)>>1;
ll ans=0;
if(l<=m)ans+=query(l,r,lson);
if(r>m) ans+=query(l,r,rson);
return ans;
}
int main()
{
ll n,Q,i,j;
scanf("%lld%lld",&n,&Q);
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
while(Q--)
{
char t[5];int x,y;
scanf("%s%d%d",&t,&x,&y);
if(t[0]=='C')
{
ll z;scanf("%lld",&z);
update(x,y,z,1);
}
else
{
printf("%lld\n",query(x,y,1));
}
}
return 0;
}