import
sys
class
node():
def
__init__(
self
):
self
.l1
=
0
self
.r1
=
0
self
.max1
=
0
seg
=
[node()
for
i
in
range
(
100001
)]
def
task(l, r):
x
=
node()
x.l1
=
l.l1
if
(l.l1 !
=
-
1
)
else
r.l1
x.r1
=
r.r1
if
(r.r1 !
=
-
1
)
else
l.r1
x.max1
=
max
(l.max1, r.max1)
if
(l.r1 !
=
-
1
and
r.l1 !
=
-
1
):
x.max1
=
max
(x.max1, r.r1
-
l.l1)
return
x
def
build(qs, qe, ind, arr):
if
(qs
=
=
qe):
if
(arr[qs]
=
=
1
):
seg[ind].l1
=
seg[ind].r1
=
qs
seg[ind].max1
=
-
sys.maxsize
else
:
seg[ind].l1
=
seg[ind].r1
=
-
1
seg[ind].max1
=
-
sys.maxsize
return
mid
=
(qs
+
qe) >>
1
build(qs, mid, ind <<
1
, arr)
build(mid
+
1
, qe, ind <<
1
|
1
, arr)
seg[ind]
=
task(seg[ind <<
1
],
seg[ind <<
1
|
1
])
def
query(qs, qe, ns, ne, ind):
x
=
node()
x.l1
=
x.r1
=
-
1
x.max1
=
-
sys.maxsize
if
(qs <
=
ns
and
qe >
=
ne):
return
seg[ind]
if
(ne < qs
or
ns > qe
or
ns > ne):
return
x
mid
=
(ns
+
ne) >>
1
l
=
query(qs, qe, ns, mid, ind <<
1
)
r
=
query(qs, qe, mid
+
1
, ne, ind <<
1
|
1
)
x
=
task(l, r)
return
x
if
__name__
=
=
"__main__"
:
arr
=
[
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
]
n
=
len
(arr)
l
=
3
r
=
9
build(
0
, n
-
1
,
1
, arr)
ans
=
query(l, r,
0
, n
-
1
,
1
)
print
(ans.max1)