# Python3 program to find Bitwise OR of two
# equal halves of an array after performing
# K right circular shifts
MAX = 100005
# Array for storing
# the segment tree
seg = [0] * (4 * MAX)
# Function to build the segment tree
def build(node, l, r, a):
if (l == r):
seg[node] = a[l]
else:
mid = (l + r) // 2
build(2 * node, l, mid, a)
build(2 * node + 1, mid + 1, r, a)
seg[node] = (seg[2 * node] |
seg[2 * node + 1])
# Function to return the OR
# of elements in the range [l, r]
def query(node, l, r, start, end, a):
# Check for out of bound condition
if (l > end or r < start):
return 0
if (start <= l and r <= end):
return seg[node]
# Find middle of the range
mid = (l + r) // 2
# Recurse for all the elements in array
return ((query(2 * node, l, mid,
start, end, a)) |
(query(2 * node + 1, mid + 1,
r, start, end, a)))
# Function to find the OR sum
def orsum(a, n, q, k):
# Function to build the segment Tree
build(1, 0, n - 1, a)
# Loop to handle q queries
for j in range(q):
# Effective number of
# right circular shifts
i = k[j] % (n // 2)
# Calculating the OR of
# the two halves of the
# array from the segment tree
# OR of second half of the
# array [n/2-i, n-1-i]
sec = query(1, 0, n - 1, n // 2 - i,
n - i - 1, a)
# OR of first half of the array
# [n-i, n-1]OR[0, n/2-1-i]
first = (query(1, 0, n - 1, 0,
n // 2 -
1 - i, a) |
query(1, 0, n - 1,
n - i,
n - 1, a))
temp = sec + first
# Print final answer to the query
print(temp)
# Driver Code
if __name__ == "__main__":
a = [ 7, 44, 19, 86, 65, 39, 75, 101 ]
n = len(a)
q = 2
k = [ 4, 2 ]
orsum(a, n, q, k)
# This code is contributed by chitranayal