MAX
=
15
tree
=
[
0
]
*
MAX
lazy
=
[
0
]
*
MAX
def
build(arr,node, a, b):
if
(a
=
=
b):
tree[node]
=
arr[a]
return
build(arr,
2
*
node, a, (a
+
b)
/
/
2
)
build(arr,
2
*
node
+
1
,
1
+
(a
+
b)
/
/
2
, b)
tree[node]
=
tree[node
*
2
]
+
tree[node
*
2
+
1
]
def
update_tree(node, a,b, i, j):
if
(lazy[node] !
=
0
):
tree[node]
=
tree[node]
*
(
-
1
)
if
(a !
=
b):
lazy[node
*
2
]
=
not
(lazy[node
*
2
])
lazy[node
*
2
+
1
]
=
not
(lazy[node
*
2
+
1
])
lazy[node]
=
0
if
(a > b
or
a > j
or
b < i):
return
if
(a >
=
i
and
b <
=
j):
tree[node]
=
tree[node]
*
(
-
1
)
if
(a !
=
b):
lazy[node
*
2
]
=
not
(lazy[node
*
2
])
lazy[node
*
2
+
1
]
=
not
(lazy[node
*
2
+
1
])
return
update_tree(node
*
2
, a,(a
+
b)
/
/
2
, i, j)
update_tree(
1
+
node
*
2
,
1
+
(a
+
b)
/
/
2
, b, i, j)
tree[node]
=
tree[node
*
2
]
+
tree[node
*
2
+
1
]
def
query_tree(node, a,b, i, j):
if
(a > b
or
a > j
or
b < i):
return
0
if
(lazy[node] !
=
0
):
tree[node]
=
tree[node]
*
(
-
1
)
if
(a !
=
b):
lazy[node
*
2
]
=
not
(lazy[node
*
2
])
lazy[node
*
2
+
1
]
=
not
(lazy[node
*
2
+
1
])
lazy[node]
=
0
if
(a >
=
i
and
b <
=
j):
return
tree[node]
q1
=
query_tree(node
*
2
, a,(a
+
b)
/
/
2
, i, j)
q2
=
query_tree(
1
+
node
*
2
,
1
+
(a
+
b)
/
/
2
, b, i, j)
return
q1
+
q2
if
__name__
=
=
'__main__'
:
arr
=
[
1
,
2
,
3
,
4
,
5
]
n
=
len
(arr)
build(arr,
1
,
0
, n
-
1
)
print
(query_tree(
1
,
0
, n
-
1
,
0
,
4
))
update_tree(
1
,
0
, n
-
1
,
0
,
4
)
print
(query_tree(
1
,
0
, n
-
1
,
0
,
4
))
update_tree(
1
,
0
, n
-
1
,
0
,
2
)
print
(query_tree(
1
,
0
, n
-
1
,
0
,
4
))