# BEGIN Yura Desk bundle: library_codex.data_structure.SegmentTree """Point updates and range products for an arbitrary monoid. Use this when values change one position at a time and a half-open interval must be folded with an associative operation. ``max_right`` and ``min_left`` also find the first boundary where a monotone predicate stops holding. """ class SegmentTree: __slots__ = ("n", "size", "log", "data", "op", "identity") def __init__(self, values, op, identity): if isinstance(values, int): n = values values = [identity] * n else: values = list(values) n = len(values) size = 1 << (n - 1).bit_length() if n else 1 data = [identity] * (size << 1) data[size : size + n] = values for node in range(size - 1, 0, -1): data[node] = op(data[node << 1], data[node << 1 | 1]) self.n = n self.size = size self.log = size.bit_length() - 1 self.data = data self.op = op self.identity = identity def set(self, index, value): node = index + self.size data = self.data data[node] = value op = self.op node >>= 1 while node: data[node] = op(data[node << 1], data[node << 1 | 1]) node >>= 1 def add(self, index, value): """indexの現在値をop(value, current)で置き換える。O(log N)。""" node = index + self.size data = self.data op = self.op data[node] = op(value, data[node]) node >>= 1 while node: data[node] = op(data[node << 1], data[node << 1 | 1]) node >>= 1 def get(self, index): return self.data[index + self.size] def tolist(self): """現在の要素列をlistで返す。O(N)。""" return self.data[self.size:self.size + self.n] def __str__(self): return str(self.tolist()) def __repr__(self): return "SegmentTree(%r)" % self.tolist() def prod(self, left, right): left += self.size right += self.size first = self.identity second = self.identity data = self.data op = self.op while left < right: if left & 1: first = op(first, data[left]) left += 1 if right & 1: right -= 1 second = op(data[right], second) left >>= 1 right >>= 1 return op(first, second) query = prod def all_prod(self): return self.data[1] def max_right(self, left, predicate): if left == self.n: return self.n left += self.size value = self.identity data = self.data op = self.op while True: while not left & 1: left >>= 1 merged = op(value, data[left]) if not predicate(merged): while left < self.size: left <<= 1 merged = op(value, data[left]) if predicate(merged): value = merged left += 1 return min(left - self.size, self.n) value = merged left += 1 if left & -left == left: break return self.n def min_left(self, right, predicate): if right == 0: return 0 right += self.size value = self.identity data = self.data op = self.op while True: right -= 1 while right > 1 and right & 1: right >>= 1 merged = op(data[right], value) if not predicate(merged): while right < self.size: right = right << 1 | 1 merged = op(data[right], value) if predicate(merged): value = merged right -= 1 return max(0, right + 1 - self.size) value = merged if right & -right == right: break return 0 def __getitem__(self, index): return self.get(index) # END Yura Desk bundle: library_codex.data_structure.SegmentTree # input import sys input = sys.stdin.readline II = lambda : int(input()) MI = lambda : map(int, input().split()) LI = lambda : [int(a) for a in input().split()] SI = lambda : input().rstrip() LLI = lambda n : [[int(a) for a in input().split()] for _ in range(n)] LSI = lambda n : [input().rstrip() for _ in range(n)] MI_1 = lambda : map(lambda x:int(x)-1, input().split()) LI_1 = lambda : [int(a)-1 for a in input().split()] mod = 998244353 inf = 1001001001001001001 ordalp = lambda s : ord(s)-65 if s.isupper() else ord(s)-97 ordallalp = lambda s : ord(s)-39 if s.isupper() else ord(s)-97 yes = lambda : print("Yes") no = lambda : print("No") yn = lambda flag : print("Yes" if flag else "No") prinf = lambda ans : print(ans if ans < 1000001001001001001 else -1) alplow = "abcdefghijklmnopqrstuvwxyz" alpup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" alpall = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" URDL = {'U':(-1,0), 'R':(0,1), 'D':(1,0), 'L':(0,-1)} DIR_4 = [[-1,0],[0,1],[1,0],[0,-1]] DIR_8 = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]] DIR_BISHOP = [[-1,1],[1,1],[1,-1],[-1,-1]] prime60 = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59] sys.set_int_max_str_digits(0) # sys.setrecursionlimit(10**6) # import pypyjit # pypyjit.set_param('max_unroll_recursion=-1') from collections import defaultdict,deque from heapq import heappop,heappush from bisect import bisect_left,bisect_right DD = defaultdict BSL = bisect_left BSR = bisect_right """ monotone : argmin f(k, *) <= argmin f(k+1, *) 各行の最小値が単調に右にずれる convex : 下に凸 concave : 上に凸 """ def monotone_minima(h, w, select): """ monotone の 最小値indexの配列 bool select : a_(i,j) < a_(i,k) (j < k) """ min_col = [0] * h que = [(0, h, 0, w)] while que: x1, x2, y1, y2 = que.pop() if x1 == x2: continue x = x1 + x2 >> 1 best_y = y1 for y in range(y1 + 1, y2): if select(x, best_y, y): best_y = y min_col[x] = best_y que.append((x+1, x2, best_y, y2)) que.append((x1, x, y1, best_y+1)) return min_col def minplus_convolusion_convex_convex(a, b): n = len(a) m = len(b) c = [0] * (n + m - 1) i = j = 0 c[0] = a[0] + b[0] for k in range(1, n+m-1): if j == m-1: i += 1 elif i == n-1: j += 1 elif a[i+1] + b[j] < a[i] + b[j+1]: i += 1 else: j += 1 c[k] = a[i] + b[j] return c def minplus_convolusion_arbitrary_convex(a, b): n = len(a) m = len(b) def select(i, j, k): if i < k: return False if i - j >= m: return True return a[j] + b[i-j] >= a[k] + b[i-k] idx = monotone_minima(n + m - 1, n, select) c = [0] * (n + m - 1) for i , j in enumerate(idx): c[i] = a[j] + b[i-j] return c def op(x, y): return minplus_convolusion_convex_convex(x, y)[:11] n, q = MI() s = LI() s = [[0, x] for x in s] seg = SegmentTree(s, op, [0]) for i in range(q): l, r, k = MI() print(seg.prod(l-1, r)[k])