← Home
For problem statement at 1000-1999/1500-1599/1560-1569/1567/problemE.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1560-1569/1567/verifierE.go ends with All tests passed can you fix the verifier? package main

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

type Node struct {
	len        int
	pref, suff int
	first      int64
	last       int64
	ans        int64
}

var (
	reader = bufio.NewReaderSize(os.Stdin, 1<<20)
	writer = bufio.NewWriterSize(os.Stdout, 1<<20)
	n, q   int
	arr    []int64
	tree   []Node
)

func nextInt64() int64 {
	var sign int64 = 1
	var val int64 = 0
	c, _ := reader.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, _ = reader.ReadByte()
	}
	if c == '-' {
		sign = -1
		c, _ = reader.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int64(c-'0')
		c, _ = reader.ReadByte()
	}
	return val * sign
}

func merge(a, b Node) Node {
	if a.len == 0 {
		return b
	}
	if b.len == 0 {
		return a
	}
	var res Node
	res.len = a.len + b.len
	res.first = a.first
	res.last = b.last
	res.pref = a.pref
	if a.pref == a.len && a.last <= b.first {
		res.pref = a.len + b.pref
	}
	res.suff = b.suff
	if b.suff == b.len && a.last <= b.first {
		res.suff = b.len + a.suff
	}
	res.ans = a.ans + b.ans
	if a.last <= b.first {
		res.ans += int64(a.suff) * int64(b.pref)
	}
	return res
}

func build(idx, l, r int) {
	if l == r {
		val := arr[l]
		tree[idx] = Node{len: 1, pref: 1, suff: 1, first: val, last: val, ans: 1}
		return
	}
	m := (l + r) >> 1
	build(idx<<1, l, m)
	build(idx<<1|1, m+1, r)
	tree[idx] = merge(tree[idx<<1], tree[idx<<1|1])
}

func update(idx, l, r, pos int, val int64) {
	if l == r {
		arr[l] = val
		tree[idx] = Node{len: 1, pref: 1, suff: 1, first: val, last: val, ans: 1}
		return
	}
	m := (l + r) >> 1
	if pos <= m {
		update(idx<<1, l, m, pos, val)
	} else {
		update(idx<<1|1, m+1, r, pos, val)
	}
	tree[idx] = merge(tree[idx<<1], tree[idx<<1|1])
}

func query(idx, l, r, ql, qr int) Node {
	if ql <= l && r <= qr {
		return tree[idx]
	}
	m := (l + r) >> 1
	if qr <= m {
		return query(idx<<1, l, m, ql, qr)
	}
	if ql > m {
		return query(idx<<1|1, m+1, r, ql, qr)
	}
	left := query(idx<<1, l, m, ql, qr)
	right := query(idx<<1|1, m+1, r, ql, qr)
	return merge(left, right)
}

func main() {
	n64 := nextInt64()
	q64 := nextInt64()
	n = int(n64)
	q = int(q64)
	arr = make([]int64, n)
	for i := 0; i < n; i++ {
		arr[i] = nextInt64()
	}
	tree = make([]Node, 4*n)
	build(1, 0, n-1)
	for i := 0; i < q; i++ {
		t := int(nextInt64())
		if t == 1 {
			x := int(nextInt64()) - 1
			y := nextInt64()
			update(1, 0, n-1, x, y)
		} else {
			l := int(nextInt64()) - 1
			r := int(nextInt64()) - 1
			res := query(1, 0, n-1, l, r)
			writer.WriteString(strconv.FormatInt(res.ans, 10))
			writer.WriteByte('\n')
		}
	}
	writer.Flush()
}