線段樹模板-單點更新 區間求和(nefuoj1472)
阿新 • • 發佈:2018-12-24
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; #define maxn 100005 ll tree[4*maxn];//一般開4倍 int n,m; void pushup(int i) { tree[i]=tree[i<<1]+tree[i<<1|1]; } void build(int i,int l,int r) { if(l==r) { tree[i]=0; return ; } int mid=(l+r)/2; build(i<<1,l,mid); build(i<<1|1,mid+1,r); pushup(i); } void update(int i,int l,int r,int x,int k) { if(l==r&&l==x) { tree[i]+=k; return ; } int mid=(l+r)/2; if(x<=mid)update(i<<1,l,mid,x,k); else update(i<<1|1,mid+1,r,x,k); pushup(i); } ll query(int i,int l,int r,int x,int y) { ll sum=0; if(x>r||y<l)return 0; if(x<=l&&r<=y) return tree[i]; int mid=(l+r)/2; if(x<=mid)sum+=query(i<<1,l,mid,x,y); if(y>mid)sum+=query(i<<1|1,mid+1,r,x,y); return sum; } int main() { int a,b,c; scanf("%d%d",&n,&m); build(1,1,n); while(m--) { scanf("%d%d%d",&a,&b,&c); if(a==0)update(1,1,n,b,c); else printf("%lld\n",query(1,1,n,b,c)); } return 0; }