← Home
package main

import (
	"fmt"
	"math/bits"
	"sort"
)

const INF int64 = 1e18

func add(a, b int64) int64 {
	if a >= INF/2 || b >= INF/2 {
		return INF
	}
	return a + b
}

func mulVecMat(V []int64, M [][]int64) []int64 {
	D := len(V)
	res := make([]int64, D)
	for i := range res {
		res[i] = INF
	}
	for u := 0; u < D; u++ {
		if V[u] >= INF/2 {
			continue
		}
		for v := 0; v < D; v++ {
			val := add(V[u], M[u][v])
			if val < res[v] {
				res[v] = val
			}
		}
	}
	return res
}

func main() {
	var x, k, n, q int
	if _, err := fmt.Scan(&x, &k, &n, &q); err != nil {
		return
	}

	c := make([]int64, k+1)
	for i := 1; i <= k; i++ {
		fmt.Scan(&c[i])
	}

	specialStones := make(map[int]int64)
	for i := 0; i < q; i++ {
		var p int
		var wp int64
		fmt.Scan(&p, &wp)
		specialStones[p] = wp
	}

	var states []int
	var maskToIndex [256]int
	for i := 0; i < (1 << k); i++ {
		if bits.OnesCount(uint(i)) == x {
			maskToIndex[i] = len(states)
			states = append(states, i)
		}
	}
	D := len(states)

	T := make([][]int64, D)
	for i := range T {
		T[i] = make([]int64, D)
		for j := range T[i] {
			T[i][j] = INF
		}
	}

	for u := 0; u < D; u++ {
		M := states[u]
		if M&1 == 0 {
			M_prime := M >> 1
			v := maskToIndex[M_prime]
			T[u][v] = 0
		} else {
			for j := 1; j <= k; j++ {
				if j == k || (M&(1<<j)) == 0 {
					M_prime := (M >> 1) | (1 << (j - 1))
					v := maskToIndex[M_prime]
					if c[j] < T[u][v] {
						T[u][v] = c[j]
					}
				}
			}
		}
	}

	var T_powers [][][]int64
	T_powers = append(T_powers, T)
	for p := 1; p < 30; p++ {
		prev := T_powers[p-1]
		next := make([][]int64, D)
		for i := range next {
			next[i] = make([]int64, D)
			for j := range next[i] {
				next[i][j] = INF
				for w := 0; w < D; w++ {
					val := add(prev[i][w], prev[w][j])
					if val < next[i][j] {
						next[i][j] = val
					}
				}
			}
		}
		T_powers = append(T_powers, next)
	}

	advanceBy := func(V []int64, m int) []int64 {
		for p := 0; p < 30; p++ {
			if (m & (1 << p)) != 0 {
				V = mulVecMat(V, T_powers[p])
			}
		}
		return V
	}

	specialStepsSet := make(map[int]bool)
	for p := range specialStones {
		for i := p - k; i <= p - 1; i++ {
			if i >= 1 && i <= n-x {
				specialStepsSet[i] = true
			}
		}
	}
	var specialSteps []int
	for i := range specialStepsSet {
		specialSteps = append(specialSteps, i)
	}
	sort.Ints(specialSteps)

	V := make([]int64, D)
	for i := range V {
		V[i] = INF
	}
	initMask := (1 << x) - 1
	V[maskToIndex[initMask]] = 0

	curr := 1
	for _, s := range specialSteps {
		if s > curr {
			V = advanceBy(V, s-curr)
			curr = s
		}

		V_new := make([]int64, D)
		for i := range V_new {
			V_new[i] = INF
		}
		for u := 0; u < D; u++ {
			if V[u] >= INF/2 {
				continue
			}
			M := states[u]
			if M&1 == 0 {
				M_prime := M >> 1
				v := maskToIndex[M_prime]
				if V[u] < V_new[v] {
					V_new[v] = V[u]
				}
			} else {
				for j := 1; j <= k; j++ {
					if j == k || (M&(1<<j)) == 0 {
						M_prime := (M >> 1) | (1 << (j - 1))
						v := maskToIndex[M_prime]
						cost := add(V[u], c[j])
						dest := s + j
						if wp, exists := specialStones[dest]; exists {
							cost = add(cost, wp)
						}
						if cost < V_new[v] {
							V_new[v] = cost
						}
					}
				}
			}
		}
		V = V_new
		curr = s + 1
	}

	if curr <= n-x {
		V = advanceBy(V, n-x-curr+1)
	}

	ans := V[maskToIndex[initMask]]
	fmt.Println(ans)
}