【模板】线段树

1|0RT,本人自己写的线段树,支持区修区查和RMQ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<code-pre class="code-pre" id="pre-4mb7be"><code-line class="line-numbers-rows"></code-line>//By lzj
<code-line class="line-numbers-rows"></code-line>#include <cstdio>
<code-line class="line-numbers-rows"></code-line>#define ri register int
<code-line class="line-numbers-rows"></code-line>#define ls p<<1
<code-line class="line-numbers-rows"></code-line>#define rs p<<1|1
<code-line class="line-numbers-rows"></code-line>#define int long long
<code-line class="line-numbers-rows"></code-line>#define INF 1e15
<code-line class="line-numbers-rows"></code-line>using namespace std;
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>const int N=1e6+15;
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>struct node{
<code-line class="line-numbers-rows"></code-line>    int l,r;
<code-line class="line-numbers-rows"></code-line>    int tag1,tag2;
<code-line class="line-numbers-rows"></code-line>    int sum,maxn,minn;
<code-line class="line-numbers-rows"></code-line>}tree[N<<2];
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>inline int read(){
<code-line class="line-numbers-rows"></code-line>    int f=1; int num=0;
<code-line class="line-numbers-rows"></code-line>    char ch=getchar();
<code-line class="line-numbers-rows"></code-line>    while(ch<'0'||ch>'9'){f|=(ch=='-'?-1:1);ch=getchar();}
<code-line class="line-numbers-rows"></code-line>    while(ch>='0'&&ch<='9'){num=(num<<1)+(num<<3)+(ch^48); ch=getchar();}
<code-line class="line-numbers-rows"></code-line>    return num*f;
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>void write(int x) {
<code-line class="line-numbers-rows"></code-line>     if(x<0) putchar('-'),x=-x;
<code-line class="line-numbers-rows"></code-line>     if(x>9) write(x/10);
<code-line class="line-numbers-rows"></code-line>     putchar(x%10+'0');
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int max(int a,int b){
<code-line class="line-numbers-rows"></code-line>    return a>b?a:b;
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int min(int a,int b){
<code-line class="line-numbers-rows"></code-line>   return a<b?a:b;
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int n,q,op,x,y,z;
<code-line class="line-numbers-rows"></code-line>int a[N];
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>void pushup(int p){
<code-line class="line-numbers-rows"></code-line>   tree[p].sum=tree[ls].sum+tree[rs].sum;
<code-line class="line-numbers-rows"></code-line>    tree[p].maxn=max(tree[ls].maxn,tree[rs].maxn);
<code-line class="line-numbers-rows"></code-line>    tree[p].minn=min(tree[ls].minn,tree[rs].minn);
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>void pushdown(int p){
<code-line class="line-numbers-rows"></code-line>    if(tree[p].tag1!=-INF){
<code-line class="line-numbers-rows"></code-line>        tree[ls].tag1=tree[rs].tag1=tree[p].tag1;
<code-line class="line-numbers-rows"></code-line>        tree[ls].maxn=tree[p].tag1;
<code-line class="line-numbers-rows"></code-line>        tree[rs].maxn=tree[p].tag1;
<code-line class="line-numbers-rows"></code-line>        tree[ls].minn=tree[p].tag1;
<code-line class="line-numbers-rows"></code-line>        tree[rs].minn=tree[p].tag1;
<code-line class="line-numbers-rows"></code-line>        tree[ls].sum=tree[p].tag1*(tree[ls].r-tree[ls].l+1);
<code-line class="line-numbers-rows"></code-line>        tree[rs].sum=tree[p].tag1*(tree[rs].r-tree[rs].l+1);
<code-line class="line-numbers-rows"></code-line>        tree[ls].tag2=tree[rs].tag2=0;
<code-line class="line-numbers-rows"></code-line>        tree[p].tag1=-INF;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    if(tree[p].tag2){
<code-line class="line-numbers-rows"></code-line>        tree[ls].tag2+=tree[p].tag2;
<code-line class="line-numbers-rows"></code-line>        tree[rs].tag2+=tree[p].tag2;
<code-line class="line-numbers-rows"></code-line>        tree[ls].maxn+=tree[p].tag2;
<code-line class="line-numbers-rows"></code-line>        tree[rs].maxn+=tree[p].tag2;
<code-line class="line-numbers-rows"></code-line>        tree[ls].minn+=tree[p].tag2;
<code-line class="line-numbers-rows"></code-line>        tree[rs].minn+=tree[p].tag2;
<code-line class="line-numbers-rows"></code-line>        tree[ls].sum+=tree[p].tag2*(tree[ls].r-tree[ls].l+1);
<code-line class="line-numbers-rows"></code-line>        tree[rs].sum+=tree[p].tag2*(tree[rs].r-tree[rs].l+1);
<code-line class="line-numbers-rows"></code-line>        tree[p].tag2=0;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>void build(int p,int l,int r){
<code-line class="line-numbers-rows"></code-line>    tree[p].l=l;tree[p].r=r; tree[p].tag1=-INF;tree[p].tag2=0;
<code-line class="line-numbers-rows"></code-line>    if(l==r){
<code-line class="line-numbers-rows"></code-line>        tree[p].sum=tree[p].minn=tree[p].maxn=a[l]; return;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    int mid=(l+r)>>1;
<code-line class="line-numbers-rows"></code-line>    build(ls,l,mid);
<code-line class="line-numbers-rows"></code-line>    build(rs,mid+1,r);
<code-line class="line-numbers-rows"></code-line>    pushup(p);
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>void update1(int p,int l,int r,int delta){
<code-line class="line-numbers-rows"></code-line>    if(l<=tree[p].l&&tree[p].r<=r){
<code-line class="line-numbers-rows"></code-line>       tree[p].sum=delta*(tree[p].r-tree[p].l+1);
<code-line class="line-numbers-rows"></code-line>        tree[p].maxn=tree[p].minn=delta;
<code-line class="line-numbers-rows"></code-line>        tree[p].tag1=delta;
<code-line class="line-numbers-rows"></code-line>        tree[p].tag2=0;
<code-line class="line-numbers-rows"></code-line>        return;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    pushdown(p);
<code-line class="line-numbers-rows"></code-line>    int mid=(tree[p].l+tree[p].r)>>1;
<code-line class="line-numbers-rows"></code-line>    if(l<=mid) update1(ls,l,r,delta);
<code-line class="line-numbers-rows"></code-line>    if(r>mid) update1(rs,l,r,delta);
<code-line class="line-numbers-rows"></code-line>    pushup(p);
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>void update2(int p,int l,int r,int delta){
<code-line class="line-numbers-rows"></code-line>    if(l<=tree[p].l&&tree[p].r<=r){
<code-line class="line-numbers-rows"></code-line>        tree[p].maxn+=delta;
<code-line class="line-numbers-rows"></code-line>        tree[p].minn+=delta;
<code-line class="line-numbers-rows"></code-line>        tree[p].sum+=(tree[p].r-tree[p].l+1)*delta;
<code-line class="line-numbers-rows"></code-line>        tree[p].tag2+=delta;
<code-line class="line-numbers-rows"></code-line>        return;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    pushdown(p);
<code-line class="line-numbers-rows"></code-line>    int mid=(tree[p].l+tree[p].r)>>1;
<code-line class="line-numbers-rows"></code-line>    if(l<=mid) update2(ls,l,r,delta);
<code-line class="line-numbers-rows"></code-line>    if(r>mid) update2(rs,l,r,delta);
<code-line class="line-numbers-rows"></code-line>    pushup(p);
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int qmax(int p,int l,int r){
<code-line class="line-numbers-rows"></code-line>    if(l<=tree[p].l&&tree[p].r<=r){
<code-line class="line-numbers-rows"></code-line>        return tree[p].maxn;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    pushdown(p);
<code-line class="line-numbers-rows"></code-line>    int mid=(tree[p].l+tree[p].r)>>1,val=-INF;
<code-line class="line-numbers-rows"></code-line>    if(l<=mid) val=max(val,qmax(ls,l,r));
<code-line class="line-numbers-rows"></code-line>    if(r>mid) val=max(val,qmax(rs,l,r));
<code-line class="line-numbers-rows"></code-line>    return val;
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int qmin(int p,int l,int r){
<code-line class="line-numbers-rows"></code-line>    if(l<=tree[p].l&&tree[p].r<=r){
<code-line class="line-numbers-rows"></code-line>        return tree[p].minn;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    pushdown(p);
<code-line class="line-numbers-rows"></code-line>    int mid=(tree[p].l+tree[p].r)>>1,val=INF;
<code-line class="line-numbers-rows"></code-line>    if(l<=mid) val=min(val,qmin(ls,l,r));
<code-line class="line-numbers-rows"></code-line>    if(r>mid) val=min(val,qmin(rs,l,r));
<code-line class="line-numbers-rows"></code-line>    return val;
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>int query(int p,int l,int r){
<code-line class="line-numbers-rows"></code-line>    if(l<=tree[p].l&&tree[p].r<=r){
<code-line class="line-numbers-rows"></code-line>        return tree[p].sum;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    pushdown(p);
<code-line class="line-numbers-rows"></code-line>    int mid=(tree[p].l+tree[p].r)>>1,val=0;
<code-line class="line-numbers-rows"></code-line>    if(l<=mid) val+=query(ls,l,r);
<code-line class="line-numbers-rows"></code-line>    if(r>mid) val+=query(rs,l,r);
<code-line class="line-numbers-rows"></code-line>    return val;
<code-line class="line-numbers-rows"></code-line>}
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>signed main(){
<code-line class="line-numbers-rows"></code-line>    n=read(); q=read();
<code-line class="line-numbers-rows"></code-line>    for(ri i=1;i<=n;i++) a[i]=read();
<code-line class="line-numbers-rows"></code-line>    build(1,1,n);
<code-line class="line-numbers-rows"></code-line>    while(q--){
<code-line class="line-numbers-rows"></code-line>        op=read();
<code-line class="line-numbers-rows"></code-line>        if(op==1){
<code-line class="line-numbers-rows"></code-line>            x=read(); y=read(); z=read();
<code-line class="line-numbers-rows"></code-line>            update1(1,x,y,z);
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        if(op==2){
<code-line class="line-numbers-rows"></code-line>            x=read(); y=read(); z=read();
<code-line class="line-numbers-rows"></code-line>            update2(1,x,y,z);
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        if(op==3){
<code-line class="line-numbers-rows"></code-line>            x=read(); y=read();
<code-line class="line-numbers-rows"></code-line>            write(qmax(1,x,y));
<code-line class="line-numbers-rows"></code-line>            putchar('\n');
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        if(op==4){
<code-line class="line-numbers-rows"></code-line>            x=read(); y=read();
<code-line class="line-numbers-rows"></code-line>            write(qmin(1,x,y));
<code-line class="line-numbers-rows"></code-line>            putchar('\n');
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        if(op==5){
<code-line class="line-numbers-rows"></code-line>           x=read(); y=read();
<code-line class="line-numbers-rows"></code-line>           write(query(1,x,y));
<code-line class="line-numbers-rows"></code-line>           putchar('\n');
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>    return 0;
<code-line class="line-numbers-rows"></code-line>}
</code-pre>

  


__EOF__

本文作者TheSky233
本文链接https://www.cnblogs.com/TheSky233/p/16058522.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TheSky233  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示