代码:
#include<iostream>
#include<vector>
using namespace std;
long long a[1000005];
struct SegTree
{
struct node
{
int l,r;
long long tag,sum;
node() { l=r=0; tag=sum=0ll; }
};
vector<node> tree;
SegTree() { tree=vector<node>(); }
SegTree(int N) { tree.resize(4*N+1); }
SegTree(int N,long long* a) { tree.resize(4*N+1); build_tree(1,N,1,a); }
int lson(int u) { return u<<1; }
int rson(int u) { return (u<<1)|1; }
void add_tag(int u,long long tag)
{
tree[u].tag+=tag;
tree[u].sum+=(tree[u].r-tree[u].l+1)*tag;
}
void down_tag(int u)
{
if(tree[u].tag==0)return;
add_tag(lson(u),tree[u].tag);
add_tag(rson(u),tree[u].tag);
tree[u].tag=0;
}
void update_node(int u) { tree[u].sum=tree[lson(u)].sum+tree[rson(u)].sum; }
void build_tree(int l,int r,int u,long long* a)
{
if(l>r)return;
tree[u].l=l;
tree[u].r=r;
if(r==l)
{
tree[u].sum=a[l];
return;
}
int mid=(l+r)>>1;
build_tree(l,mid,lson(u),a);
build_tree(mid+1,r,rson(u),a);
update_node(u);
}
void range_add(int l,int r,int u,long long add)
{
if(l<=tree[u].l&&tree[u].r<=r)
{
add_tag(u,add);
return;
}
int mid=(tree[u].l+tree[u].r)>>1;
down_tag(u);
if(l<=mid) range_add(l,r,lson(u),add);
if(mid<r) range_add(l,r,rson(u),add);
update_node(u);
}
long long range_query(int l,int r,int u)
{
if(l<=tree[u].l&&tree[u].r<=r) return tree[u].sum;
int mid=(tree[u].l+tree[u].r)>>1;
long long ans=0;
down_tag(u);
if(l<=mid) ans+=range_query(l,r,lson(u));
if(mid<r) ans+=range_query(l,r,rson(u));
return ans;
}
};
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
SegTree Tr(n,a);
for(int i=1;i<=m;++i)
{
int op,l,r,k;
cin>>op>>l>>r;
if(op==1)
{
cin>>k;
Tr.range_add(l,r,1,k);
}
else
{
cout<<Tr.range_query(l,r,1)<<'\n';
}
}
return 0;
}
评测显示“在第一行的答案太短”