package main
import (
"bufio"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
buf := make([]byte, 1024*1024)
scanner.Buffer(buf, 1024*1024)
readInt := func() int {
scanner.Scan()
res, _ := strconv.Atoi(scanner.Text())
return res
}
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
C := make([]int, n+1)
P := make([][]float64, n+1)
for i := 1; i <= n; i++ {
a := readInt()
C[i] = a
P[i] = make([]float64, a+1)
P[i][a] = 1.0
}
var comb [6][6]float64
for i := 0; i <= 5; i++ {
comb[i][0] = 1.0
for j := 1; j <= i; j++ {
comb[i][j] = comb[i-1][j-1] + comb[i-1][j]
}
}
const blockSize = 500
numBlocks := (n + blockSize) / blockSize
blockSum := make([]float64, numBlocks)
for i := 1; i <= n; i++ {
blockIdx := i / blockSize
blockSum[blockIdx] += P[i][0]
}
q := readInt()
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
temp := make([]float64, 105)
for iter := 0; iter < q; iter++ {
u := readInt()
v := readInt()
k := readInt()
l := len(P[u])
for x := 0; x < l; x++ {
temp[x] = 0.0
}
for x := 0; x < l; x++ {
if P[u][x] == 0 {
continue
}
for j := 0; j <= k; j++ {
if j > x || k-j > C[u]-x {
continue
}
prob := comb[k][j]
for i := 0; i < j; i++ {
prob *= float64(x-i) / float64(C[u]-i)
}
for i := 0; i < k-j; i++ {
prob *= float64(C[u]-x-i) / float64(C[u]-j-i)
}
temp[x-j] += P[u][x] * prob
}
}
for x := 0; x < l; x++ {
P[u][x] = temp[x]
}
C[u] -= k
C[v] += k
blockIdx := u / blockSize
sum := 0.0
start := blockIdx * blockSize
end := start + blockSize
if end > n+1 {
end = n + 1
}
if start == 0 {
start = 1
}
for i := start; i < end; i++ {
sum += P[i][0]
}
blockSum[blockIdx] = sum
E := 0.0
for i := 0; i < numBlocks; i++ {
E += blockSum[i]
}
out.WriteString(strconv.FormatFloat(E, 'f', 12, 64))
out.WriteByte('\n')
}
}