题目链接:求区间和
分析
线段树模板单点修改+区间查询。
上代码
我写的build纯属练手。。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m,tree[300001];
ll ans;
void build(int k,int l,int r)
{
if(l==r)
{
tree[k]=0;
return;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tree[k]=tree[k*2]+tree[k*2+1];
}
void change(int k,int l,int r,int x,int w)
{
if(l==r)
{
tree[k]+=w;
return;
}
int mid=(l+r)/2;
if(x<=mid) change(k*2,l,mid,x,w);
else change(k*2+1,mid+1,r,x,w);
tree[k]=tree[k*2]+tree[k*2+1];
}
ll query(int k,int l,int r,int x,int y)
{
if(x<=l&&y>=r) return tree[k];
int mid=(l+r)/2;
ll s=0;
if(x<=mid) s+=query(k*2,l,mid,x,y);
if(y>mid) s+=query(k*2+1,mid+1,r,x,y);
return s;
}
int main()
{
cin>>n>>m;
//build(1,1,n);
for(int i=1;i<=m;i++)
{
int k,x,y;
scanf("%d%d%d",&k,&x,&y);
if(k==0)
{
change(1,1,n,x,y);
}
else
{
ans=query(1,1,n,x,y);
printf("%lld\n",ans);
}
}
return 0;
}