← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func readInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	b := scanner.Bytes()
	res := 0
	for _, v := range b {
		if v >= '0' && v <= '9' {
			res = res*10 + int(v-'0')
		}
	}
	return res
}

func readInt64(scanner *bufio.Scanner) int64 {
	scanner.Scan()
	b := scanner.Bytes()
	var res int64 = 0
	for _, v := range b {
		if v >= '0' && v <= '9' {
			res = res*10 + int64(v-'0')
		}
	}
	return res
}

func power(base, exp, mod int64) int64 {
	res := int64(1)
	base %= mod
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % mod
		}
		base = (base * base) % mod
		exp /= 2
	}
	return res
}

func floorSum(n, m, a, b int64) int64 {
	var ans int64 = 0
	if a >= m {
		ans += (n - 1) * n / 2 * (a / m)
		a %= m
	}
	if b >= m {
		ans += n * (b / m)
		b %= m
	}
	yMax := (a*n + b) / m
	if yMax == 0 {
		return ans
	}
	xMax := yMax*m - b
	ans += (n - (xMax+a-1)/a) * yMax
	ans += floorSum(yMax, a, m, (a-xMax%a)%a)
	return ans
}

var inv2, inv6, inv12, inv30 int64

func getT(k int64, M int64) (int64, int64, int64, int64, int64) {
	kMod := k % M
	kMinus1 := (k - 1) % M

	T1 := kMod * kMinus1 % M * inv2 % M

	T2 := kMod * kMinus1 % M * (2*kMod - 1) % M * inv6 % M
	if T2 < 0 {
		T2 += M
	}

	T3 := T1 * T1 % M

	poly4 := (3*kMod*kMod - 3*kMod - 1) % M
	if poly4 < 0 {
		poly4 += M
	}
	T4 := kMod * kMinus1 % M * (2*kMod - 1) % M * poly4 % M * inv30 % M
	if T4 < 0 {
		T4 += M
	}

	poly5 := (2*kMod*kMod - 2*kMod - 1) % M
	if poly5 < 0 {
		poly5 += M
	}
	T5 := kMod * kMod % M * (kMinus1 * kMinus1 % M) % M * poly5 % M * inv12 % M
	if T5 < 0 {
		T5 += M
	}

	return T1, T2, T3, T4, T5
}

func expectedSp(p int, a, D, kMod int64, T []int64, M int64) int64 {
	ans := int64(0)
	C := [][]int64{
		{1},
		{1, 1},
		{1, 2, 1},
		{1, 3, 3, 1},
		{1, 4, 6, 4, 1},
		{1, 5, 10, 10, 5, 1},
	}
	for c := 0; c <= p; c++ {
		term := C[p][c]
		term = term * power(a, int64(p-c), M) % M
		term = term * power(D, int64(c), M) % M
		var tc int64
		if c == 0 {
			tc = kMod
		} else {
			tc = T[c-1]
		}
		term = term * tc % M
		ans = (ans + term) % M
	}
	return ans
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buf := make([]byte, 10*1024*1024)
	scanner.Buffer(buf, 10*1024*1024)

	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	if !scanner.Scan() {
		return
	}
	N, _ := strconv.Atoi(scanner.Text())
	scanner.Scan()
	Q, _ := strconv.Atoi(scanner.Text())

	M := int64(1000000007)
	inv2 = power(2, M-2, M)
	inv6 = power(6, M-2, M)
	inv12 = power(12, M-2, M)
	inv30 = power(30, M-2, M)

	A := make([]int64, N)
	for i := 0; i < N; i++ {
		A[i] = readInt64(scanner)
	}

	prefExact := make([]int64, N+1)
	prefMod2 := make([]int64, N+1)
	prefMod3 := make([]int64, N+1)
	prefMod4 := make([]int64, N+1)
	prefMod5 := make([]int64, N+1)

	for i := 1; i <= N; i++ {
		val := A[i-1]
		prefExact[i] = prefExact[i-1] + val

		v2 := val * val % M
		prefMod2[i] = (prefMod2[i-1] + v2) % M

		v3 := v2 * val % M
		prefMod3[i] = (prefMod3[i-1] + v3) % M

		v4 := v3 * val % M
		prefMod4[i] = (prefMod4[i-1] + v4) % M

		v5 := v4 * val % M
		prefMod5[i] = (prefMod5[i-1] + v5) % M
	}

	K_st := 1
	for (1 << K_st) <= N {
		K_st++
	}
	minSt := make([][]int32, K_st)
	maxSt := make([][]int32, K_st)
	for i := 0; i < K_st; i++ {
		minSt[i] = make([]int32, N)
		maxSt[i] = make([]int32, N)
	}
	for i := 0; i < N; i++ {
		minSt[0][i] = int32(A[i])
		maxSt[0][i] = int32(A[i])
	}
	for j := 1; j < K_st; j++ {
		for i := 0; i+(1<<j) <= N; i++ {
			v1 := minSt[j-1][i]
			v2 := minSt[j-1][i+(1<<(j-1))]
			if v1 < v2 {
				minSt[j][i] = v1
			} else {
				minSt[j][i] = v2
			}

			v1M := maxSt[j-1][i]
			v2M := maxSt[j-1][i+(1<<(j-1))]
			if v1M > v2M {
				maxSt[j][i] = v1M
			} else {
				maxSt[j][i] = v2M
			}
		}
	}

	log2 := make([]int, N+1)
	for i := 2; i <= N; i++ {
		log2[i] = log2[i/2] + 1
	}

	isSame := func(L, R int) bool {
		length := R - L + 1
		j := log2[length]
		v1 := minSt[j][L]
		v2 := minSt[j][R-(1<<j)+1]
		minVal := v1
		if v2 < v1 {
			minVal = v2
		}
		v1M := maxSt[j][L]
		v2M := maxSt[j][R-(1<<j)+1]
		maxVal := v1M
		if v2M > v1M {
			maxVal = v2M
		}
		return minVal == maxVal
	}

	for i := 0; i < Q; i++ {
		L := readInt(scanner)
		R := readInt(scanner)
		D_i := readInt64(scanner)

		if L > R {
			L, R = R, L
		}

		k := R - L + 1
		if k == 1 {
			fmt.Fprintln(writer, "Yes")
			continue
		}

		if D_i == 0 {
			if isSame(L-1, R-1) {
				fmt.Fprintln(writer, "Yes")
			} else {
				fmt.Fprintln(writer, "No")
			}
			continue
		}

		S_exact := prefExact[R] - prefExact[L-1]
		S1_mod := S_exact % M

		T1, T2, T3, T4, T5 := getT(int64(k), M)
		T := []int64{T1, T2, T3, T4, T5}

		invK := power(int64(k), M-2, M)
		a := (S1_mod - D_i*T1) % M
		if a < 0 {
			a += M
		}
		a = a * invK % M

		W := floorSum(int64(k), M, D_i, a)
		term1 := uint64(k) * uint64(a)
		pairs := uint64(k) * uint64(k-1) / 2
		term2 := uint64(D_i) * pairs
		term3 := uint64(M) * uint64(W)

		expected_exact_u := term1 + term2 - term3
		if S_exact != int64(expected_exact_u) {
			fmt.Fprintln(writer, "No")
			continue
		}

		S2_mod := (prefMod2[R] - prefMod2[L-1]) % M
		if S2_mod < 0 {
			S2_mod += M
		}
		if S2_mod != expectedSp(2, a, D_i, int64(k)%M, T, M) {
			fmt.Fprintln(writer, "No")
			continue
		}

		S3_mod := (prefMod3[R] - prefMod3[L-1]) % M
		if S3_mod < 0 {
			S3_mod += M
		}
		if S3_mod != expectedSp(3, a, D_i, int64(k)%M, T, M) {
			fmt.Fprintln(writer, "No")
			continue
		}

		S4_mod := (prefMod4[R] - prefMod4[L-1]) % M
		if S4_mod < 0 {
			S4_mod += M
		}
		if S4_mod != expectedSp(4, a, D_i, int64(k)%M, T, M) {
			fmt.Fprintln(writer, "No")
			continue
		}

		S5_mod := (prefMod5[R] - prefMod5[L-1]) % M
		if S5_mod < 0 {
			S5_mod += M
		}
		if S5_mod != expectedSp(5, a, D_i, int64(k)%M, T, M) {
			fmt.Fprintln(writer, "No")
			continue
		}

		fmt.Fprintln(writer, "Yes")
	}
}
```