package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
if !scanner.Scan() {
return
}
q, _ := strconv.Atoi(scanner.Text())
weights := make(map[int64]int64)
for i := 0; i < q; i++ {
scanner.Scan()
op, _ := strconv.Atoi(scanner.Text())
if op == 1 {
scanner.Scan()
v, _ := strconv.ParseInt(scanner.Text(), 10, 64)
scanner.Scan()
u, _ := strconv.ParseInt(scanner.Text(), 10, 64)
scanner.Scan()
w, _ := strconv.ParseInt(scanner.Text(), 10, 64)
for v != u {
if v > u {
weights[v] += w
v /= 2
} else {
weights[u] += w
u /= 2
}
}
} else if op == 2 {
scanner.Scan()
v, _ := strconv.ParseInt(scanner.Text(), 10, 64)
scanner.Scan()
u, _ := strconv.ParseInt(scanner.Text(), 10, 64)
var ans int64
for v != u {
if v > u {
ans += weights[v]
v /= 2
} else {
ans += weights[u]
u /= 2
}
}
fmt.Fprintln(writer, ans)
}
}
}