← Home
```go
package main

import (
	"io"
	"os"
)

func main() {
	buf := make([]byte, 8192)
	var pos, length int
	var eof bool

	readChar := func() byte {
		if pos >= length {
			if eof {
				return 0
			}
			n, err := os.Stdin.Read(buf)
			if n == 0 || err != nil && err != io.EOF {
				eof = true
				return 0
			}
			pos = 0
			length = n
		}
		b := buf[pos]
		pos++
		return b
	}

	readInt := func() int {
		b := readChar()
		for b <= ' ' && b != 0 {
			b = readChar()
		}
		if b == 0 {
			return 0
		}
		sign := 1
		if b == '-' {
			sign = -1
			b = readChar()
		}
		res := 0
		for b > ' ' {
			res = res*10 + int(b-'0')
			b = readChar()
		}
		return res * sign
	}

	n := readInt()
	if n == 0 {
		return
	}
	m := readInt()
	k := readInt()
	q := readInt()

	head := make([]int, n+1)
	for i := range head {
		head[i] = -1
	}
	to := make([]int, 2*m)
	next := make([]int, 2*m)
	cap := make([]int, 2*m)
	flow := make([]int, 2*m)
	baseFlow := make([]int, 2*m)

	edgeCount := 0
	addEdge := func(u, v, c int) {
		to[edgeCount] = v
		cap[edgeCount] = c
		flow[edgeCount] = 0
		next[edgeCount] = head[u]
		head[u] = edgeCount
		edgeCount++

		to[edgeCount] = u
		cap[edgeCount] = 0
		flow[edgeCount] = 0
		next[edgeCount] = head[v]
		head[v] = edgeCount
		edgeCount++
	}

	for i := 0; i < m; i++ {
		u := readInt()
		v := readInt()
		c := readInt()
		addEdge(u, v, c)
	}

	d := make([]int, n+1)
	work := make([]int, n+1)
	vis := make([]uint32, n+1)
	var visId uint32 = 0
	qu := make([]int, n+1)

	bfs := func(S, T int) bool {
		visId++
		qu[0] = S
		headQ, tailQ := 0, 1
		vis[S] = visId
		d[S] = 0
		for headQ < tailQ {
			u := qu[headQ]
			headQ++
			for e := head[u]; e != -1; e = next[e] {
				v := to[e]
				if vis[v] != visId && cap[e] > flow[e] {
					vis[v] = visId
					d[v] = d[u] + 1
					qu[tailQ] = v
					tailQ++
					if v == T {
						return true
					}
				}
			}
		}
		return false
	}

	var dfs func(u, push int) int
	dfs = func(u, push int) int {
		if push == 0 || u == n {
			return push
		}
		for ; work[u] != -1; work[u] = next[work[u]] {
			e := work[u]
			v := to[e]
			if vis[v] == visId && d[v] == d[u]+1 && cap[e] > flow[e] {
				tr := push
				if cap[e]-flow[e] < tr {
					tr = cap[e] - flow[e]
				}
				pushed := dfs(v, tr)
				if pushed == 0 {
					continue
				}
				flow[e] += pushed
				flow[e^1] -= pushed
				return pushed
			}
		}
		return 0
	}

	baseMaxFlow := 0
	for bfs(1, n) {
		copy(work, head)
		for {
			pushed := dfs(1, 1000000000)
			if pushed == 0 {
				break
			}
			baseMaxFlow += pushed
		}
	}
	copy(baseFlow, flow)

	w := make([]int, k)
	outBytes := make([]byte, 0, 20*q)

	appendInt := func(val int) {
		if val == 0 {
			outBytes = append(outBytes, '0', '\n')
			return
		}
		var buf [20]byte
		p := 19
		for val > 0 {
			buf[p] = byte(val%10) + '0'
			val /= 10
			p--
		}
		outBytes = append(outBytes, buf[p+1:]...)
		outBytes = append(outBytes, '\n')
	}

	for i := 0; i < q; i++ {
		for j := 0; j < k; j++ {
			w[j] = readInt()
			cap[2*j] = w[j]
		}
		copy(flow, baseFlow)
		addFlow := 0
		for bfs(1, n) {
			copy(work, head)
			for {
				pushed := dfs(1, 1000000000)
				if pushed == 0 {
					break
				}
				addFlow += pushed
			}
		}
		appendInt(baseMaxFlow + addFlow)
		for j := 0; j < k; j++ {
			cap[2*j] = 0
		}
	}
	os.Stdout.Write(outBytes)
}
```