← Home
For problem statement at 0-999/400-499/430-439/438/problemD.txt this is a correct solution, but verifier at 0-999/400-499/430-439/438/verifierD.go ends with All tests passed can you fix the verifier? package main

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

type SegTree struct {
	sum []int64
	mx  []int64
}

func NewSegTree(a []int64, n int) *SegTree {
	st := &SegTree{
		sum: make([]int64, 4*n+5),
		mx:  make([]int64, 4*n+5),
	}
	st.build(1, 1, n, a)
	return st
}

func (st *SegTree) build(p, l, r int, a []int64) {
	if l == r {
		st.sum[p] = a[l]
		st.mx[p] = a[l]
		return
	}
	m := (l + r) >> 1
	st.build(p<<1, l, m, a)
	st.build(p<<1|1, m+1, r, a)
	st.pull(p)
}

func (st *SegTree) pull(p int) {
	st.sum[p] = st.sum[p<<1] + st.sum[p<<1|1]
	if st.mx[p<<1] > st.mx[p<<1|1] {
		st.mx[p] = st.mx[p<<1]
	} else {
		st.mx[p] = st.mx[p<<1|1]
	}
}

func (st *SegTree) rangeMod(p, l, r, ql, qr int, x int64) {
	if st.mx[p] < x {
		return
	}
	if l == r {
		v := st.sum[p] % x
		st.sum[p] = v
		st.mx[p] = v
		return
	}
	m := (l + r) >> 1
	if ql <= m {
		st.rangeMod(p<<1, l, m, ql, qr, x)
	}
	if qr > m {
		st.rangeMod(p<<1|1, m+1, r, ql, qr, x)
	}
	st.pull(p)
}

func (st *SegTree) pointSet(p, l, r, idx int, v int64) {
	if l == r {
		st.sum[p] = v
		st.mx[p] = v
		return
	}
	m := (l + r) >> 1
	if idx <= m {
		st.pointSet(p<<1, l, m, idx, v)
	} else {
		st.pointSet(p<<1|1, m+1, r, idx, v)
	}
	st.pull(p)
}

func (st *SegTree) rangeSum(p, l, r, ql, qr int) int64 {
	if ql <= l && r <= qr {
		return st.sum[p]
	}
	m := (l + r) >> 1
	var res int64
	if ql <= m {
		res += st.rangeSum(p<<1, l, m, ql, qr)
	}
	if qr > m {
		res += st.rangeSum(p<<1|1, m+1, r, ql, qr)
	}
	return res
}

var data []byte
var ptr int
var ndata int

func nextInt64() int64 {
	for ptr < ndata && data[ptr] <= ' ' {
		ptr++
	}
	var v int64
	for ptr < ndata && data[ptr] > ' ' {
		v = v*10 + int64(data[ptr]-'0')
		ptr++
	}
	return v
}

func main() {
	data, _ = io.ReadAll(bufio.NewReaderSize(os.Stdin, 1<<20))
	ndata = len(data)

	n := int(nextInt64())
	m := int(nextInt64())

	a := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		a[i] = nextInt64()
	}

	st := NewSegTree(a, n)
	var out bytes.Buffer

	for i := 0; i < m; i++ {
		t := int(nextInt64())
		if t == 1 {
			l := int(nextInt64())
			r := int(nextInt64())
			out.WriteString(strconv.FormatInt(st.rangeSum(1, 1, n, l, r), 10))
			out.WriteByte('\n')
		} else if t == 2 {
			l := int(nextInt64())
			r := int(nextInt64())
			x := nextInt64()
			st.rangeMod(1, 1, n, l, r, x)
		} else {
			k := int(nextInt64())
			x := nextInt64()
			st.pointSet(1, 1, n, k, x)
		}
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out.Bytes())
	w.Flush()
}