class SparseTable(): def __init__(self, array, n): '''テーブルを構築する''' self.row_size = n.bit_length() # log_tableを構築する # log_table = [0, 0, 1, 1, 2, 2, 2, 2, ...] self.log_table = [0] * (n + 1) for i in range(2, n + 1): self.log_table[i] = self.log_table[i//2] + 1 # sparse_tableを構築する self.sparse_table = [[0] * n for _ in range(self.row_size)] for i in range(n): self.sparse_table[0][i] = array[i] for row in range(1, self.row_size): for i in range(n - (1 << row) + 1): self.sparse_table[row][i] = self._merge(self.sparse_table[row - 1][i], \ self.sparse_table[row - 1][i + (1 << row - 1)]) def _merge(self, num1, num2): '''クエリの内容''' return max(num1, num2) def query(self, l, r): '''区間[l, r)に対するクエリに答える''' if r == l: return None row = self.log_table[r - l] return self._merge(self.sparse_table[row][l], self.sparse_table[row][r - (1 << row)]) n, q = map(int, input().split()) a = list(map(int, input().split())) sp = SparseTable(a, n) ind_memo = {} for i in range(n): ind_memo[a[i]] = i ruiseki = [0]*(n+1) for i in range(n): if i == 0: ruiseki[i+1] = 1 elif a[i-1] < a[i]: ruiseki[i+1] = ruiseki[i] + 1 else: ruiseki[i+1] = ruiseki[i] #print(ruiseki) for _ in range(q): _, l, r = map(int, input().split()) ans = 0 while True: if ruiseki[r] - ruiseki[l-1] == r - l + 1: ans += r - l + 1 break if l-1 == r: break max_ind = ind_memo[sp.query(l - 1, r)] ans += 1 r = max_ind print(ans)