← Home
```go
package main

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

const maxBits = 21

type Pair struct {
	Val int32
	Cnt int32
}

type Node struct {
	Pre    [maxBits]Pair
	PreLen int
	Suf    [maxBits]Pair
	SufLen int
	Ans    int64
}

var x int32

func merge(a, b Node) Node {
	if a.PreLen == 0 {
		return b
	}
	if b.PreLen == 0 {
		return a
	}
	var res Node

	copy(res.Pre[:], a.Pre[:a.PreLen])
	res.PreLen = a.PreLen
	lastVal := a.Pre[a.PreLen-1].Val
	for i := 0; i < b.PreLen; i++ {
		newVal := lastVal | b.Pre[i].Val
		if newVal == res.Pre[res.PreLen-1].Val {
			res.Pre[res.PreLen-1].Cnt += b.Pre[i].Cnt
		} else {
			res.Pre[res.PreLen] = Pair{newVal, b.Pre[i].Cnt}
			res.PreLen++
		}
	}

	copy(res.Suf[:], b.Suf[:b.SufLen])
	res.SufLen = b.SufLen
	lastVal = b.Suf[b.SufLen-1].Val
	for i := 0; i < a.SufLen; i++ {
		newVal := lastVal | a.Suf[i].Val
		if newVal == res.Suf[res.SufLen-1].Val {
			res.Suf[res.SufLen-1].Cnt += a.Suf[i].Cnt
		} else {
			res.Suf[res.SufLen] = Pair{newVal, a.Suf[i].Cnt}
			res.SufLen++
		}
	}

	res.Ans = a.Ans + b.Ans
	for i := 0; i < a.SufLen; i++ {
		av := a.Suf[i].Val
		ac := a.Suf[i].Cnt
		for j := 0; j < b.PreLen; j++ {
			if (av | b.Pre[j].Val) >= x {
				res.Ans += int64(ac) * int64(b.Pre[j].Cnt)
			}
		}
	}
	return res
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1<<20), 1<<20)
	scanner.Split(bufio.ScanWords)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

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

	n := readInt()
	m := readInt()
	x = int32(readInt())

	arr := make([]int32, n)
	for i := 0; i < n; i++ {
		arr[i] = int32(readInt())
	}

	N := 1
	for N < n {
		N <<= 1
	}
	tree := make([]Node, 2*N)

	for i := 0; i < n; i++ {
		v := arr[i]
		idx := N + i
		tree[idx].Pre[0] = Pair{v, 1}
		tree[idx].PreLen = 1
		tree[idx].Suf[0] = Pair{v, 1}
		tree[idx].SufLen = 1
		if v >= x {
			tree[idx].Ans = 1
		}
	}

	for i := N - 1; i >= 0; i-- {
		tree[i] = merge(tree[2*i], tree[2*i+1])
	}

	for q := 0; q < m; q++ {
		typ := readInt()
		if typ == 1 {
			pos := readInt() - 1
			val := int32(readInt())
			idx := N + pos
			tree[idx].Pre[0] = Pair{val, 1}
			tree[idx].PreLen = 1
			tree[idx].Suf[0] = Pair{val, 1}
			tree[idx].SufLen = 1
			if val >= x {
				tree[idx].Ans = 1
			} else {
				tree[idx].Ans = 0
			}
			for idx > 0 {
				idx >>= 1
				tree[idx] = merge(tree[2*idx], tree[2*idx+1])
			}
		} else {
			l := readInt() - 1
			r := readInt() - 1
			l += N
			r += N
			var leftRes, rightRes Node
			for l <= r {
				if l&1 == 1 {
					leftRes = merge(leftRes, tree[l])
					l++
				}
				if r&1 == 0 {
					rightRes = merge(tree[r], rightRes)
					r--
				}
				l >>= 1
				r >>= 1
			}
			res := merge(leftRes, rightRes)
			writer.WriteString(strconv.FormatInt(res.Ans, 10))
			writer.WriteByte('\n')
		}
	}
}
```