1. 线段树单点更新,区间查询(求和)
#include<bits/stdc++.h>
using namespace std;
const int maxn=500005;
int n,m,data[maxn],tree[maxn*4],xx,yy,zz;
void build_tree(int now,int l,int r)
{
if(l>r)return ;
if(l==r)
{
tree[now]=data[l];
return ;
}
int mid=(l+r)>>1;
build_tree(now*2,l,mid);
build_tree(now*2+1,mid+1,r);
tree[now]=tree[now*2]+tree[now*2+1];
}
int check(int now,int l,int r,int x,int y)
{
if(l>r)return 0;
if(x<=l&&r<=y)return tree[now];
if(y<l||r<x)return 0;
int mid=(l+r)>>1;
return check(now*2,l,mid,x,y)+check(now*2+1,mid+1,r,x,y);
}
void update(int now,int l,int r,int x,int y)
{
if(l<=x&&x<=r);
else return ;
// cout<<l<<" "<<r<<endl;
if(l==r&&l==x)
{
tree[now]+=y;
return ;
}
int mid=(l+r)>>1;
update(now*2,l,mid,x,y);
update(now*2+1,mid+1,r,x,y);
tree[now]=tree[now*2]+tree[now*2+1];
return ;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&data[i]);
}
build_tree(1,1,n);
while(m--)
{
scanf("%d%d%d",&xx,&yy,&zz);
if(xx==1)
{
update(1,1,n,yy,zz);
}
else
{
printf("%d\n",check(1,1,n,yy,zz));
}
}
return 0;
}
2. 线段树区间更新,区间查询(lazy_tag)
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n,data[maxn],q,o,u,v,c;
struct node
{
long long sum,add;
}tree[maxn*4];
void build_tree(int now,int L,int R)
{
if(L==R)
{
tree[now].sum=data[L];
return ;
}
build_tree(now*2,L,(L+R)/2);
build_tree(now*2+1,(L+R)/2+1,R);
tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
}
void push_down(int now,int L,int R)
{
int mid=(L+R)/2,ls=now*2,rs=ls+1;
tree[ls].add+=tree[now].add;
tree[rs].add+=tree[now].add;
tree[ls].sum+=(mid-L+1)*tree[now].add;
tree[rs].sum+=(R-(mid+1)+1)*tree[now].add;
tree[now].add=0;
}
long long ask(int now,int L,int R,int x,int y)
{
if(x<=L&&R<=y)
{
return tree[now].sum;
}
if(y<L||R<x)
return 0;
int mid=(L+R)/2;
push_down(now,L,R);
return ask(now*2,L,mid,x,y)+ask(now*2+1,mid+1,R,x,y);
}
void update(int now,int L,int R,int x,int y,int c)
{
if(x<=L&&R<=y)
{
tree[now].add+=c;
tree[now].sum+=(R-L+1)*c;
return ;
}
if(y<L||R<x)
return ;
push_down(now,L,R);
int mid=(L+R)/2;
update(now*2,L,mid,x,y,c);
update(now*2+1,mid+1,R,x,y,c);
tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
}
int main()
{
scanf("%d",&n);
scanf("%d",&q);
for(int i=1;i<=n;i++)
scanf("%d",&data[i]);
build_tree(1,1,n);
while(q--)
{
scanf("%d",&o);
if(o==1)
{
scanf("%d%d%d",&u,&v,&c);
update(1,1,n,u,v,c);
}
else
{
scanf("%d%d",&u,&v);
if(u>v)
swap(u,v);
printf("%lld\n",ask(1,1,n,u,v));
}
}
return 0;
}