← Home
```go
package main

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

var scanner *bufio.Scanner

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

func nextInt() int {
	scanner.Scan()
	res, _ := strconv.Atoi(scanner.Text())
	return res
}

const MOD = 1000000007

var fact [200005]int
var inv [200005]int

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

func initFact() {
	fact[0] = 1
	inv[0] = 1
	for i := 1; i <= 200000; i++ {
		fact[i] = (fact[i-1] * i) % MOD
	}
	inv[200000] = power(fact[200000], MOD-2)
	for i := 199999; i >= 1; i-- {
		inv[i] = (inv[i+1] * (i + 1)) % MOD
	}
}

func nCr(n, k int) int {
	if k < 0 || k > n {
		return 0
	}
	return fact[n] * inv[k] % MOD * inv[n-k] % MOD
}

var diff [105][100005]int

func main() {
	initFact()
	n := nextInt()
	m := nextInt()

	a := make([]int, n+1)
	for i := 1; i <= n; i++ {
		a[i] = nextInt() % MOD
	}

	for i := 0; i < m; i++ {
		l := nextInt()
		r := nextInt()
		k := nextInt()

		diff[k][l] = (diff[k][l] + 1) % MOD
		if r+1 <= n {
			for d := 0; d <= k; d++ {
				val := nCr(r-l+k-d, k-d)
				diff[d][r+1] = (diff[d][r+1] - val + MOD) % MOD
			}
		}
	}

	for k := 100; k >= 0; k-- {
		for i := 1; i <= n; i++ {
			diff[k][i] = (diff[k][i] + diff[k][i-1]) % MOD
		}
		if k > 0 {
			for i := 1; i <= n; i++ {
				diff[k-1][i] = (diff[k-1][i] + diff[k][i]) % MOD
			}
		}
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	for i := 1; i <= n; i++ {
		ans := (a[i] + diff[0][i]) % MOD
		if i == n {
			fmt.Fprintf(out, "%d\n", ans)
		} else {
			fmt.Fprintf(out, "%d ", ans)
		}
	}
}
```