```go
package main
import (
"io"
"os"
"strconv"
)
type FastScanner struct {
data []byte
idx int
n int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data, n: len(data)}
}
func (fs *FastScanner) NextInt64() int64 {
for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
fs.idx++
}
sign := int64(1)
if fs.data[fs.idx] == '-' {
sign = -1
fs.idx++
}
var val int64
for fs.idx < fs.n {
c := fs.data[fs.idx]
if c < '0' || c > '9' {
break
}
val = val*10 + int64(c-'0')
fs.idx++
}
return sign * val
}
type BIT struct {
n int
pw int
tree []int64
}
func NewBIT(n int) BIT {
pw := 1
for pw<<1 <= n {
pw <<= 1
}
return BIT{n: n, pw: pw, tree: make([]int64, n+2)}
}
func (b *BIT) Add(i int, delta int64) {
for i <= b.n {
b.tree[i] += delta
i += i & -i
}
}
func (b *BIT) Sum(i int) int64 {
if i < 1 {
return 0
}
if i > b.n {
i = b.n
}
var s int64
for i > 0 {
s += b.tree[i]
i -= i & -i
}
return s
}
func (b *BIT) Kth(k int64) int {
idx := 0
bit := b.pw
for bit > 0 {
next := idx + bit
if next <= b.n && b.tree[next] < k {
idx = next
k -= b.tree[next]
}
bit >>= 1
}
return idx + 1
}
type Dim struct {
n int
diff []int64
zeros BIT
c0 BIT
c1 BIT
c2 BIT
c3 BIT
totalCnt int64
}
func NewDim(n int) *Dim {
return &Dim{
n: n,
diff: make([]int64, n+1),
zeros: NewBIT(n + 1),
c0: NewBIT(n),
c1: NewBIT(n),
c2: NewBIT(n),
c3: NewBIT(n),
}
}
func (d *Dim) addBlock(s int, sign int64) {
x := int64(s)
d.c0.Add(s, sign)
d.c1.Add(s, sign*x)
d.c2.Add(s, sign*x*x)
d.c3.Add(s, sign*x*x*x)
d.totalCnt += sign
}
func BuildDim(vals []int64) (*Dim, []int) {
n := len(vals) - 1
d := NewDim(n)
d.zeros.Add(1, 1)
d.zeros.Add(n+1, 1)
prev := 0
blocks := make([]int, 0)
for i := 1; i < n; i++ {
d.diff[i] = vals[i+1] - vals[i]
if d.diff[i] == 0 {
d.zeros.Add(i+1, 1)
s := i - prev
d.addBlock(s, 1)
blocks = append(blocks, s)
prev = i
}
}
s := n - prev
d.addBlock(s, 1)
blocks = append(blocks, s)
return d, blocks
}
func (d *Dim) QueryContribution(s int) int64 {
lim := s - 1
if lim > d.n {
lim = d.n
}
f0 := d.c0.Sum(lim)
f1 := d.c1.Sum(lim)
f2 := d.c2.Sum(lim)
f3 := d.c3.Sum(lim)
x := int64(s)
res := (-f3 + 3*x*f2 + (3*x+1)*f1) / 6
if s <= d.n {
suffixCnt := d.totalCnt - f0
suffixSum := int64(d.n) - f1
res += x * (x + 1) * (3*suffixSum - (x-1)*suffixCnt) / 6
}
return res
}
func (d *Dim) prevZero(p int) int {
cnt := d.zeros.Sum(p)
return d.zeros.Kth(cnt) - 1
}
func (d *Dim) nextZero(p int) int {
cnt := d.zeros.Sum(p + 1)
return d.zeros.Kth(cnt+1) - 1
}
func (d *Dim) updatePoint(p int, delta int64, other *Dim, ans *int64) {
if p < 1 || p >= d.n || delta == 0 {
return
}
oldZero := d.diff[p] == 0
d.diff[p] += delta
newZero := d.diff[p] == 0
if oldZero == newZero {
return
}
if oldZero {
l := d.prevZero(p)
r := d.nextZero(p)
s1 := p - l
s2 := r - p
s := r - l
*ans -= other.QueryContribution(s1)
*ans -= other.QueryContribution(s2)
*ans += other.QueryContribution(s)
d.addBlock(s1, -1)
d.addBlock(s2, -1)
d.addBlock(s, 1)
d.zeros.Add(p+1, -1)
} else {
l := d.prevZero(p)
r := d.nextZero(p)
s := r - l
s1 := p - l
s2 := r - p
*ans -= other.QueryContribution(s)
*ans += other.QueryContribution(s1)
*ans += other.QueryContribution(s2)
d.addBlock(s, -1)
d.addBlock(s1, 1)
d.addBlock(s2, 1)
d.zeros.Add(p+1, 1)
}
}
func main() {
fs := NewFastScanner()
n := int(fs.NextInt64())
m := int(fs.NextInt64())
q := int(fs.NextInt64())
a := make([]int64, n+1)
for i := 1; i <= n; i++ {
a[i] = fs.NextInt64()
}
b := make([]int64, m+1)
for i := 1; i <= m; i++ {
b[i] = fs.NextInt64()
}
A, blocksA := BuildDim(a)
B, blocksB := BuildDim(b)
var ans int64
if len(blocksA) <= len(blocksB) {
for _, s := range blocksA {
ans += B.QueryContribution(s)
}
} else {
for _, s := range blocksB {
ans += A.QueryContribution(s)
}
}
out := make([]byte, 0, (q+1)*24)
out = strconv.AppendInt(out, ans, 10)
out = append(out, '\n')
for i := 0; i < q; i++ {
t := int(fs.NextInt64())
l := int(fs.NextInt64())
r := int(fs.NextInt64())
x := fs.NextInt64()
if t == 1 {
if l > 1 {
A.updatePoint(l-1, x, B, &ans)
}
if r < n {
A.updatePoint(r, -x, B, &ans)
}
} else {
if l > 1 {
B.updatePoint(l-1, x, A, &ans)
}
if r < m {
B.updatePoint(r, -x, A, &ans)
}
}
out = strconv.AppendInt(out, ans, 10)
out = append(out, '\n')
}
os.Stdout.Write(out)
}
```