class SegmentTree:
def __init__(self, n):
self.n = n
self.tree = [0] * (4 * n)
self.lazy = [0] * (4 * n)
def push(self, node, start, end):
if self.lazy[node] != 0:
self.tree[node] += self.lazy[node] * (end - start + 1)
if start != end:
self.lazy[2 * node] += self.lazy[node]
self.lazy[2 * node + 1] += self.lazy[node]
self.lazy[node] = 0
def update_range(self, node, start, end, l, r, val):
self.push(node, start, end)
if start > r or end < l:
return
if l <= start and end <= r:
self.lazy[node] += val
self.push(node, start, end)
return
mid = (start + end) // 2
self.update_range(2 * node, start, mid, l, r, val)
self.update_range(2 * node + 1, mid + 1, end, l, r, val)
self.tree[node] = self.tree[2 * node] + self.tree[2 * node + 1]
def query(self, node, start, end, idx):
self.push(node, start, end)
if start == end:
return self.tree[node]
mid = (start + end) // 2
if idx <= mid:
return self.query(2 * node, start, mid, idx)
else:
return self.query(2 * node + 1, mid + 1, end, idx)
def solve():
# Input
n, m, z = map(int, input().split())
a = list(map(int, input().split()))
v = [0] * n # Initial values of leaves eaten per day
# Segment tree for range updates
seg_tree = SegmentTree(n)
# Process modifications and queries
operations = []
for _ in range(m + z):
op = list(map(int, input().split()))
operations.append(op)
answers = []
for op in operations:
op_type, p, x = op
if op_type == 1: # Modification
seg_tree.update_range(1, 0, n - 1, 0, p - 1, x)
else: # Query
total_leaves = 0
for i in range(p): # Check first p days
if a[i] >= x: # Tree x is visited if x <= a[i]
total_leaves += seg_tree.query(1, 0, n - 1, i)
answers.append(total_leaves)
# Output answers for queries
for ans in answers:
print(ans)
if __name__ == "__main__":
solve()
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | class SegmentTree: def __init__(self, n): self.n = n self.tree = [0] * (4 * n) self.lazy = [0] * (4 * n) def push(self, node, start, end): if self.lazy[node] != 0: self.tree[node] += self.lazy[node] * (end - start + 1) if start != end: self.lazy[2 * node] += self.lazy[node] self.lazy[2 * node + 1] += self.lazy[node] self.lazy[node] = 0 def update_range(self, node, start, end, l, r, val): self.push(node, start, end) if start > r or end < l: return if l <= start and end <= r: self.lazy[node] += val self.push(node, start, end) return mid = (start + end) // 2 self.update_range(2 * node, start, mid, l, r, val) self.update_range(2 * node + 1, mid + 1, end, l, r, val) self.tree[node] = self.tree[2 * node] + self.tree[2 * node + 1] def query(self, node, start, end, idx): self.push(node, start, end) if start == end: return self.tree[node] mid = (start + end) // 2 if idx <= mid: return self.query(2 * node, start, mid, idx) else: return self.query(2 * node + 1, mid + 1, end, idx) def solve(): # Input n, m, z = map(int, input().split()) a = list(map(int, input().split())) v = [0] * n # Initial values of leaves eaten per day # Segment tree for range updates seg_tree = SegmentTree(n) # Process modifications and queries operations = [] for _ in range(m + z): op = list(map(int, input().split())) operations.append(op) answers = [] for op in operations: op_type, p, x = op if op_type == 1: # Modification seg_tree.update_range(1, 0, n - 1, 0, p - 1, x) else: # Query total_leaves = 0 for i in range(p): # Check first p days if a[i] >= x: # Tree x is visited if x <= a[i] total_leaves += seg_tree.query(1, 0, n - 1, i) answers.append(total_leaves) # Output answers for queries for ans in answers: print(ans) if __name__ == "__main__": solve() |
English