This documentation is automatically generated by online-judge-tools/verification-helper
# verification-helper: PROBLEM https://judge.yosupo.jp/problem/static_range_sum
require "../../src/datastructure/cul_sum"
_, q = read_line.split.map(&.to_i)
a = read_line.split.map(&.to_i64)
sum = CulSum.new(a)
q.times do
l, r = read_line.split.map(&.to_i)
puts sum[l...r]
end
# verification-helper: PROBLEM https://judge.yosupo.jp/problem/static_range_sum
# require "../../src/datastructure/cul_sum"
class CulSum(T)
def self.build(a : Enumerable(T))
result = [T.zero]
a.each do |x|
result << result[-1] + x
end
result
end
def initialize(a : Array(T))
@n = a.size
@s = Array(T).new(@n + 1, T.zero)
@n.times do |i|
@s[i + 1] = @s[i] + a[i]
end
end
def initialize(@n : Int32, &f : Int32 -> T)
@s = Array(T).new(@n + 1, T.zero)
@n.times do |i|
@s[i + 1] = @s[i] + yield(i)
end
end
def initialize(a, &f)
@n = a.size
@s = Array(T).new(@n + 1, T.zero)
@n.times do |i|
@s[i + 1] = @s[i] + yield(a[i])
end
end
def [](left : Int32, count : Int32) : T
@s[left + count] - @s[left]
end
def [](range : Range) : T
self[*Indexable.range_to_index_and_count(range, @n) || raise IndexError.new]
end
def to_a : Array(T)
(0...@n).map { |i| self[i..i] }
end
end
_, q = read_line.split.map(&.to_i)
a = read_line.split.map(&.to_i64)
sum = CulSum.new(a)
q.times do
l, r = read_line.split.map(&.to_i)
puts sum[l...r]
end