← Home
```go
package main

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

type Interval struct {
	l, r int
	p    float64
	id   int
}

var (
	a        []int
	intervals []Interval
	children [][]int
	base_max []int
	log2     []int
	st       [][]int
	SZ       int
	offset   int
	pool     [][]float64
)

func query(l, r int) int {
	if l > r {
		return -2000000000
	}
	j := log2[r-l+1]
	if st[l][j] > st[r-(1<<j)+1][j] {
		return st[l][j]
	}
	return st[r-(1<<j)+1][j]
}

func getArray() []float64 {
	if len(pool) > 0 {
		res := pool[len(pool)-1]
		pool = pool[:len(pool)-1]
		return res
	}
	return make([]float64, SZ)
}

func putArray(arr []float64) {
	pool = append(pool, arr)
}

func dfs(u int) []float64 {
	var res []float64
	if len(children[u]) > 0 {
		res = dfs(children[u][0])
		for i := 1; i < len(children[u]); i++ {
			v := children[u][i]
			fv := dfs(v)
			for j := 0; j < SZ; j++ {
				res[j] *= fv[j]
			}
			putArray(fv)
		}
	} else {
		res = getArray()
		for i := 0; i < SZ; i++ {
			res[i] = 1.0
		}
	}

	bMax := base_max[u]
	if bMax < offset {
		bMax = offset
	}
	bIdx := bMax - offset

	for i := 0; i < bIdx && i < SZ; i++ {
		res[i] = 0.0
	}

	p := intervals[u].p
	for i := SZ - 1; i >= 0; i-- {
		term1 := (1.0 - p) * res[i]
		term2 := 0.0
		if i > 0 {
			term2 = p * res[i-1]
		}
		res[i] = term1 + term2
	}

	return res
}

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

	readInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	readFloat := func() float64 {
		scanner.Scan()
		res, _ := strconv.ParseFloat(scanner.Text(), 64)
		return res
	}

	if !scanner.Scan() {
		return
	}
	n := 0
	for _, b := range scanner.Bytes() {
		n = n*10 + int(b-'0')
	}
	q := readInt()

	a = make([]int, n+2)
	A_max := -2000000000
	for i := 1; i <= n; i++ {
		a[i] = readInt()
		if a[i] > A_max {
			A_max = a[i]
		}
	}

	offset = A_max - q
	for i := 1; i <= n; i++ {
		if a[i] < offset {
			a[i] = offset
		}
	}
	a[0] = offset
	a[n+1] = offset

	log2 = make([]int, n+2)
	log2[1] = 0
	for i := 2; i < n+2; i++ {
		log2[i] = log2[i/2] + 1
	}
	k := 0
	for (1 << k) <= n+2 {
		k++
	}
	st = make([][]int, n+2)
	for i := range st {
		st[i] = make([]int, k)
		st[i][0] = a[i]
	}
	for j := 1; (1 << j) <= n+2; j++ {
		for i := 0; i+(1<<j) <= n+2; i++ {
			if st[i][j-1] > st[i+(1<<(j-1))][j-1] {
				st[i][j] = st[i][j-1]
			} else {
				st[i][j] = st[i+(1<<(j-1))][j-1]
			}
		}
	}

	intervals = make([]Interval, q+1)
	intervals[0] = Interval{l: 0, r: n + 1, p: 0.0, id: 0}
	for i := 1; i <= q; i++ {
		l := readInt()
		r := readInt()
		p := readFloat()
		intervals[i] = Interval{l: l, r: r, p: p, id: i}
	}

	sort.Slice(intervals, func(i, j int) bool {
		if intervals[i].l != intervals[j].l {
			return intervals[i].l < intervals[j].l
		}
		return intervals[i].r > intervals[j].r
	})

	children = make([][]int, q+1)
	stack := []int{0}
	for i := 1; i <= q; i++ {
		for len(stack) > 0 {
			top := stack[len(stack)-1]
			if intervals[top].r >= intervals[i].r {
				break
			}
			stack = stack[:len(stack)-1]
		}
		top := stack[len(stack)-1]
		children[top] = append(children[top], i)
		stack = append(stack, i)
	}

	base_max = make([]int, q+1)
	for u := 0; u <= q; u++ {
		l := intervals[u].l
		r := intervals[u].r
		bMax := -2000000000

		currL := l
		for _, v := range children[u] {
			childL := intervals[v].l
			childR := intervals[v].r
			if currL <= childL-1 {
				val := query(currL, childL-1)
				if val > bMax {
					bMax = val
				}
			}
			currL = childR + 1
		}
		if currL <= r {
			val := query(currL, r)
			if val > bMax {
				bMax = val
			}
		}
		base_max[u] = bMax
	}

	SZ = 2*q + 1
	F_root := dfs(0)

	ans := 0.0
	for i := 0; i < SZ; i++ {
		prob := F_root[i]
		if i > 0 {
			prob -= F_root[i-1]
		}
		ans += prob * float64(offset+i)
	}

	fmt.Printf("%.9f\n", ans)
}
```