6
3
0
1 <= N <= 50,000
1 <= Q <= 180,000
没有修改的区间最大最小值,直接用树状数组做就可以啦
可是翻了一下Status发现只有我一个人用的树状数组似乎,没错那个内存三位数的就是我!不过时间怎么会慢了一点的说….
当然这道题用线段树才是简单易懂,一些无聊的神犇还会套主席树的模板… 果然还是我太弱了啊…
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
|
var
minn
,
maxx
,
a
:
array
[
0..50001
]
of
longint
;
n
,
q
,
i
,
l
,
r
,
x
,
ans1
,
ans2
:
longint
;
function
max
(
a
,
b
:
longint
)
:
longint
;
begin
if
a
>
b
then
exit
(
a
)
else
exit
(
b
)
;
end
;
function
min
(
a
,
b
:
longint
)
:
longint
;
begin
if
a
>
b
then
exit
(
b
)
else
exit
(
a
)
;
end
;
function
lowbit
(
x
:
longint
)
:
longint
;
begin
exit
(
x
and
(-
x
)
)
;
end
;
procedure
ins
(
p
,
w
:
longint
)
;
begin
while
p
<=
n
do
begin
minn
[
p
]
:=
min
(
minn
[
p
]
,
w
)
;
maxx
[
p
]
:=
max
(
maxx
[
p
]
,
w
)
;
inc
(
p
,
lowbit
(
p
)
)
;
end
;
end
;
function
find
(
l
,
r
:
longint
)
:
longint
;
begin
ans1
:=
0
;
ans2
:=
maxlongint
;
while
true
do
begin
ans1
:=
max
(
ans1
,
a
[
r
]
)
;
ans2
:=
min
(
ans2
,
a
[
r
]
)
;
if
l
=
r
then
break
;
dec
(
r
)
;
while
r
-
l
>=
lowbit
(
r
)
do
begin
ans1
:=
max
(
ans1
,
maxx
[
r
]
)
;
ans2
:=
min
(
ans2
,
minn
[
r
]
)
;
dec
(
r
,
lowbit
(
r
)
)
;
end
;
end
;
exit
(
ans1
-
ans2
)
;
end
;
begin
readln
(
n
,
q
)
;
for
i
:=
1
to
n
do
begin
maxx
[
i
]
:=
0
;
minn
[
i
]
:=
maxlongint
;
end
;
for
i
:=
1
to
n
do
begin
readln
(
a
[
i
]
)
;
ins
(
i
,
a
[
i
]
)
;
end
;
for
i
:=
1
to
q
do
begin
readln
(
l
,
r
)
;
writeln
(
find
(
l
,
r
)
)
;
end
;
end
.
|