线段树模板(单点修改区间求和)
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#define maxn 500010
using namespace std;
struct point
{
int l,r,val;
}tr[maxn*4];
int m,n;
int a[maxn];
void buildtree(int x,int l,int r)
{
tr[x].l=l;
tr[x].r=r;
if(l==r)
{
tr[x].val=a[l];
return;
}
int lch=x*2,rch=x*2+1;
int mid=(l+r)/2;
buildtree(lch, l, mid);
buildtree(rch, mid+1, r);
tr[x].val=tr[x*2].val+tr[x*2+1].val;
}
void modify(int x,int pos,int val)
{
if(tr[x].l==tr[x].r)
{
tr[x].val+=val;
return;
}
int mid=(tr[x].l+tr[x].r)/2;
if(pos<=mid)
modify(x*2, pos, val);
else
modify(x*2+1, pos, val);
tr[x].val=tr[x*2].val+tr[x*2+1].val;
}
int query(int x,int l,int r)
{
if(l<=tr[x].l && tr[x].r<=r)
return tr[x].val;
int mid=(tr[x].l+tr[x].r)/2;
int ans=0;
if(l<=mid)
ans+=query(x*2, l, r);
if(r>mid)
ans+=query(x*2+1, l, r);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
buildtree(1, 1, n);
for(int i=1;i<=m;i++)
{
int op;
scanf("%d",&op);
if(op==1)
{
int x,k;
scanf("%d%d",&x,&k);
modify(1, x, k);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query(1, x, y));
}
}
}
作者&出处:ShineEternal
本文阅读完毕欢迎到此留言:link
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
你看地这么津津有味,不点个赞再走吗QAQ