一个简单的线段树,直接套模板就OK。
#include<stdio.h> #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; struct Tree { int left,right; int sum; }tree[400009]; int s[200001]; void build(int id, int l, int r) { tree[id].left=l; tree[id].right=r; if(l==r) { tree[id].sum=s[l]; return ; } int mid=(l+r)/2; build(id*2,l,mid); build(id*2+1,mid+1,r); tree[id].sum=tree[id*2].sum+tree[id*2+1].sum; } void update(int id,int pos,int val) { if(tree[id].left==tree[id].right) { tree[id].sum+=val; return; } if(tree[id*2].right>=pos) update(id*2,pos,val); else update(id*2+1,pos,val); tree[id].sum=tree[id*2].sum+tree[id*2+1].sum; } int query(int id,int l, int r) { if(tree[id].left==l&&tree[id].right==r) return tree[id].sum; else { int mid=(tree[id].left+tree[id].right)/2; if(r<=mid) return query(id*2,l,r); else if(l>mid) return query(id*2+1,l,r); else return query(id*2,l,mid)+query(id*2+1,mid+1,r); } } int main() { int n,m,i,a,b,c; while(scanf("%d%d",&n,&m)==2) { for(i=1;i<=n;i++) scanf("%d",&s[i]); build(1,1,n); while(m--) { scanf("%d%d%d",&a,&b,&c); if(a==1) { update(1,b,c); } else { printf("%d\n",query(1,b,c)); } } } return 0; }