Skip to content

Commit e7679f5

Browse files
authored
线段树维护区间最小值(未验证正确性)
1 parent 35d7faa commit e7679f5

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed

Segment-Tree(Minimum).cpp

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#include <cstdio>
2+
3+
using namespace std;
4+
5+
struct node
6+
{
7+
int l, r, min, lazy;
8+
}T[4000010];
9+
10+
int d[1000010];
11+
12+
inline int min(int x, int y)
13+
{
14+
return x < y ? x : y;
15+
}
16+
17+
void build_tree(int l, int r, int k)
18+
{
19+
T[k].l = l;
20+
T[k].r = r;
21+
if (l == r)
22+
{
23+
T[k].min = d[l];
24+
}
25+
else
26+
{
27+
int mid = (l + r) >> 1;
28+
build_tree(l, mid, k << 1);
29+
build_tree(mid + 1, r, (k << 1) + 1);
30+
T[k].min = min(T[k << 1].min, T[(k << 1) + 1].min);
31+
}
32+
}
33+
34+
int delta;
35+
void update(int l, int r, int k)
36+
{
37+
if (T[k].l == l && T[k].r == r)
38+
{
39+
T[k].lazy += delta;
40+
T[k].min += delta;
41+
}
42+
else
43+
{
44+
int mid = (T[k].l + T[k].r) >> 1;
45+
if (r <= mid)
46+
{
47+
update(l, r, k << 1);
48+
}
49+
else if (l > mid)
50+
{
51+
update(l, r, (k << 1) + 1);
52+
}
53+
else
54+
{
55+
update(l, mid, k << 1);
56+
update(mid + 1, r, (k << 1) + 1);
57+
}
58+
T[k].min = min(T[k << 1].min, T[(k << 1) + 1].min);
59+
}
60+
}
61+
62+
int query(int l, int r, int k)
63+
{
64+
if (T[k].l == l && T[k].r == r)
65+
{
66+
return T[k].min;
67+
}
68+
else
69+
{
70+
int mid = (T[k].l + T[k].r) >> 1;
71+
T[k << 1].lazy += T[k].lazy;
72+
T[k << 1].min += T[k].lazy;
73+
T[(k << 1) + 1].lazy += T[k].lazy;
74+
T[(k << 1) + 1].min += T[k].lazy;
75+
T[k].lazy = 0;
76+
if (r <= mid)
77+
{
78+
return query(l, r, k << 1);
79+
}
80+
else if (l > mid)
81+
{
82+
return query(l, r, (k << 1) + 1);
83+
}
84+
else
85+
{
86+
return min(query(l, mid, k << 1), query(mid + 1, r, (k << 1) + 1));
87+
}
88+
}
89+
}
90+
91+
int main()
92+
{
93+
int n;
94+
scanf("%d", &n);
95+
for (int i = 1; i <= n; i++)
96+
{
97+
scanf("%d", &d[i]);
98+
}
99+
build_tree(1, n, 1);
100+
while (true)
101+
{
102+
int o, a, b, d;
103+
scanf("%d", &o);
104+
switch (o)
105+
{
106+
case 1:
107+
scanf("%d%d", &a, &b);
108+
printf("%d\n", query(a, b, 1));
109+
break;
110+
case 2:
111+
scanf("%d%d%d", &a, &b, &d);
112+
delta = d;
113+
update(a, b, 1);
114+
break;
115+
}
116+
}
117+
return 0;
118+
}

0 commit comments

Comments
 (0)