← Home
```go
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	n := nextInt()
	k := nextInt()
	m := nextInt()

	l := make([]int, m)
	r := make([]int, m)
	x := make([]int, m)
	for i := 0; i < m; i++ {
		l[i] = nextInt()
		r[i] = nextInt()
		x[i] = nextInt()
	}

	const MOD int = 998244353

	diff := make([]int, n+3)
	needAt := make([]int, n+1)
	pref := make([]int, n+1)

	ans := 1
	mask := 1

	for bit := 0; bit < k; bit++ {
		for i := 0; i <= n+1; i++ {
			diff[i] = 0
		}
		for i := 0; i <= n; i++ {
			needAt[i] = 0
		}

		for i := 0; i < m; i++ {
			if x[i]&mask != 0 {
				diff[l[i]]++
				diff[r[i]+1]--
			} else {
				if l[i] > needAt[r[i]] {
					needAt[r[i]] = l[i]
				}
			}
		}

		pref[0] = 1
		cover := 0
		need := 0

		for i := 1; i <= n; i++ {
			cover += diff[i]

			val := pref[i-1]
			if need > 0 {
				val -= pref[need-1]
				if val < 0 {
					val += MOD
				}
			}
			if cover > 0 {
				val = 0
			}

			sum := pref[i-1] + val
			if sum >= MOD {
				sum -= MOD
			}
			pref[i] = sum

			if needAt[i] > need {
				need = needAt[i]
			}
		}

		cnt := pref[n]
		if need > 0 {
			cnt -= pref[need-1]
			if cnt < 0 {
				cnt += MOD
			}
		}

		ans = int(int64(ans) * int64(cnt) % int64(MOD))
		mask <<= 1
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.WriteString(strconv.Itoa(ans))
	w.Flush()
}
```