点更新:
1 #include <fstream> //点更新 2 #include <iostream> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N=10000; 8 int n,m,a[N]; 9 struct node 10 { 11 int left,right; 12 int max_,sum_; 13 }tree[4*N]; 14 15 void build(int id,int l,int r);//建一棵线段树 16 int query_sum(int id,int l,int r);//查询区间和 17 int query_max(int id,int l,int r);//查询区间最大值 18 void update(int id,int pos,int val);//更新位置pos的值增加val 19 20 int main() 21 { 22 //freopen("D:\\input.in","r",stdin); 23 //freopen("D:\\output.out","w",stdout); 24 int bo,t1,t2; 25 scanf("%d%d",&n,&m); 26 for(int i=1;i<=n;i++) 27 scanf("%d",&a[i]); 28 build(1,1,n); 29 for(int i=1;i<=m;i++) 30 { 31 scanf("%d%d%d",&bo,&t1,&t2); 32 if(bo)//更新(这里指增加) 33 update(1,t1,t2); 34 else 35 printf("%d\n",query_sum(1,t1,t2)); 36 } 37 return 0; 38 } 39 void build(int id,int l,int r) 40 { 41 tree[id].left=l; 42 tree[id].right=r; 43 if(l==r) 44 { 45 tree[id].sum_=a[l]; 46 tree[id].max_=a[l]; 47 } 48 else 49 { 50 int mid=(l+r)/2; 51 build(2*id,l,mid); 52 build(2*id+1,mid+1,r); 53 tree[id].sum_=tree[2*id].sum_+tree[2*id+1].sum_; 54 tree[id].max_=max(tree[2*id].max_,tree[2*id+1].max_); 55 } 56 } 57 int query_sum(int id,int l,int r) 58 { 59 if(tree[id].left==l&&tree[id].right==r) 60 return tree[id].sum_; 61 else 62 { 63 int mid=(tree[id].left+tree[id].right)/2; 64 if(r<=mid) return query_sum(2*id,l,r); 65 else if(l>mid) return query_sum(2*id+1,l,r); 66 else 67 return query_sum(2*id,l,mid)+query_sum(2*id+1,mid+1,r); 68 } 69 } 70 int query_max(int id,int l,int r) 71 { 72 if(tree[id].left==l&&tree[id].right==r) 73 return tree[id].max_; 74 else 75 { 76 int mid=(tree[id].left+tree[id].right)/2; 77 if(r<=mid) return query_max(2*id,l,r); 78 else if(l>mid) return query_max(2*id+1,l,r); 79 else 80 return max(query_max(2*id,l,mid),query_max(2*id+1,mid+1,r)); 81 } 82 } 83 void update(int id,int pos,int val) 84 { 85 if(tree[id].left==tree[id].right) 86 { 87 tree[id].sum_+=val;//假如修改而不是增加,就把+=改为=。 88 tree[id].max_+=val; 89 } 90 else 91 { 92 int mid=(tree[id].left+tree[id].right)/2; 93 if(pos<=mid) update(2*id,pos,val); 94 else update(2*id+1,pos,val); 95 tree[id].sum_=tree[2*id].sum_+tree[2*id+1].sum_; 96 tree[id].max_=max(tree[2*id].max_,tree[2*id+1].max_); 97 } 98 }