线段树模板(单点更新)

Posted moomcake

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板(单点更新)相关的知识,希望对你有一定的参考价值。

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int MAXN=2e5+10;
 8 #define lson l,m,i<<1
 9 #define rson m+1,r,i<<1|1
10 typedef struct Node
11 {
12     int l,r;
13     int mid()
14     {
15         return (l+r)/2.0;
16     }
17     int value;
18 } Node;
19 Node node[MAXN<<2];
20 void push_up(int i)
21 {
22     node[i].value=max(node[i<<1].value,node[i<<1|1].value);
23 }
24 void Build(int l,int r,int i)
25 {
26     node[i].l=l;
27     node[i].r=r;
28     node[i].value=0;
29     if(l==r)
30     {
31         scanf("%d",&node[i].value);
32         return ;
33     }
34     int m=node[i].mid();
35     Build(lson);
36     Build(rson);
37     push_up(i);
38 }
39 int M;
40 void query(int l,int r,int i)
41 {
42     if(node[i].l==l&&node[i].r==r)
43     {
44         M=max(node[i].value,M);
45         return;
46     }
47     int m=node[i].mid();
48     if(r<=m)
49         query(l,r,i<<1);
50     else
51     {
52         if(l>m)
53             query(l,r,i<<1|1);
54         else
55         {
56             query(lson);
57             query(rson);
58         }
59     }
60 }
61 void update(int l,int r,int i,int v,int num)
62 {
63     if(l==r&&l==num)
64     {
65         node[i].value=v;
66         return;
67     }
68     int m=node[i].mid();
69     if(m>=num)
70         update(l,m,i<<1,v,num);
71     else
72     {
73         update(m+1,r,i<<1|1,v,num);
74     }
75     push_up(i);
76 }
77 int main()
78 {
79     int m,n,a,b;
80     char s[1234];
81     while(scanf("%d%d",&n,&m)!=-1)
82     {
83         Build(1,n,1);
84         while(m--)
85         {
86             scanf(" %s%d%d",&s,&a,&b);
87             if(s[0]==Q)
88             {
89                 M=0;
90                 query(a,b,1);
91                 cout<<M<<endl;
92             }
93             else
94             {
95                 update(1,n,1,b,a);
96             }
97         }
98     }
99 }
View Code

 

以上是关于线段树模板(单点更新)的主要内容,如果未能解决你的问题,请参考以下文章

线段树区间最值单点更新模板BNUOJ 52965 E Excellent Engineers

模板线段树-单点修改,区间查询

P3834 模板可持久化线段树 1(主席树)

HDU 1166 - 敌兵布阵 - [单点修改区间查询zkw线段树]

kuangbin带你飞----线段树专题一(基础操作,单点,区间更新和查询)

模板 线段树(部分功能)