```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
const MOD = 1000000007
func power(base, exp int64) int64 {
res := int64(1)
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
type Interval struct {
l, r int
}
func getValue(x int, E []int, arr []int64) int64 {
if x == -1 {
return 0
}
idx := sort.SearchInts(E, x)
if idx < len(E) && E[idx] == x {
return arr[idx]
}
return 0
}
var rdr *bufio.Reader = bufio.NewReaderSize(os.Stdin, 65536)
func readInt() int {
var n int
var c byte
for {
c, _ = rdr.ReadByte()
if c >= '0' && c <= '9' {
n = int(c - '0')
break
}
}
for {
c, _ = rdr.ReadByte()
if c >= '0' && c <= '9' {
n = n*10 + int(c-'0')
} else {
break
}
}
return n
}
func main() {
k := readInt()
n := readInt()
m := readInt()
A := make([]Interval, n)
for i := 0; i < n; i++ {
A[i] = Interval{readInt(), readInt()}
}
B := make([]Interval, m)
for i := 0; i < m; i++ {
B[i] = Interval{readInt(), readInt()}
}
E_temp := make([]int, 0, 2+2*n+2*m)
E_temp = append(E_temp, 0, k)
for _, iv := range A {
E_temp = append(E_temp, iv.l-1, iv.r)
}
for _, iv := range B {
E_temp = append(E_temp, iv.l-1, iv.r)
}
sort.Ints(E_temp)
E_uniq := make([]int, 0, len(E_temp))
last := -1
for _, val := range E_temp {
if val != last && val >= 0 && val <= k {
E_uniq = append(E_uniq, val)
last = val
}
}
E_temp2 := make([]int, 0, 2*len(E_uniq))
for _, val := range E_uniq {
E_temp2 = append(E_temp2, val)
if val > 0 {
E_temp2 = append(E_temp2, val-1)
}
}
sort.Ints(E_temp2)
E := make([]int, 0, len(E_temp2))
last = -1
for _, val := range E_temp2 {
if val != last && val >= 0 && val <= k {
E = append(E, val)
last = val
}
}
sort.Slice(A, func(i, j int) bool { return A[i].r < A[j].r })
sort.Slice(B, func(i, j int) bool { return B[i].r < B[j].r })
SO := make([]int64, len(E))
SR := make([]int64, len(E))
SO[0] = 1
SR[0] = 1
var curS int64 = 2
idxA := 0
idxB := 0
maxLA := 0
maxLB := 0
inv2 := int64(500000004)
for i := 1; i < len(E); i++ {
x := E[i-1] + 1
y := E[i]
for idxA < len(A) && A[idxA].r <= y {
if A[idxA].l > maxLA {
maxLA = A[idxA].l
}
idxA++
}
for idxB < len(B) && B[idxB].r <= y {
if B[idxB].l > maxLB {
maxLB = B[idxB].l
}
idxB++
}
d := int64(y - x + 1)
CA := getValue(maxLA-1, E, SO)
CB := getValue(maxLB-1, E, SR)
C := (CA + CB) % MOD
term := (curS - C + MOD) % MOD
nextS := (power(2, d) * term) % MOD
nextS = (nextS + C) % MOD
D := (CA - CB + MOD) % MOD
nextSO := (nextS + D) % MOD
nextSO = (nextSO * inv2) % MOD
nextSR := (nextS - D + MOD) % MOD
nextSR = (nextSR * inv2) % MOD
SO[i] = nextSO
SR[i] = nextSR
curS = nextS
}
lastIdx := len(E) - 1
Sk := (SO[lastIdx] + SR[lastIdx]) % MOD
Sk_1 := (SO[lastIdx-1] + SR[lastIdx-1]) % MOD
ans := (Sk - Sk_1 + MOD) % MOD
fmt.Println(ans)
}
```