点更新:

 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 }
View Code

相关文章:

  • 2021-08-28
  • 2022-12-23
  • 2021-08-21
  • 2021-10-07
  • 2021-05-26
  • 2021-08-01
  • 2021-11-18
猜你喜欢
  • 2021-08-30
  • 2021-11-30
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案