Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8)9 1011var sz93 int12var b93 []int13 14type fenwick93 [][]int3215 16func newFenwick93(n, m int) fenwick93 {17 t := make(fenwick93, (n-1)/sz93+2)18 for i := range t {19 t[i] = make([]int32, m+1)20 }21 return t22}23 24func (t fenwick93) update(x, y int, val int32) {25 for i := x/sz93 + 1; i < len(t); i += i & -i {26 for j := y + 1; j < len(t[i]); j += j & -j {27 t[i][j] += val28 }29 }30}31 32func (t fenwick93) pre(x, y int) (res int32) {33 if x < 0 || y < 0 {34 return35 }36 for _, v := range b93[x-x%sz93 : x+1] {37 if v <= y {38 res++39 }40 }41 for i := x / sz93; i > 0; i &= i - 1 {42 for j := y + 1; j > 0; j &= j - 1 {43 res += t[i][j]44 }45 }46 return47}48 49func (t fenwick93) query(l1, r1, l2, r2 int) int32 {50 return t.pre(r1, r2) - t.pre(r1, l2-1) - t.pre(l1-1, r2) + t.pre(l1-1, l2-1)51}52 53func cf1093E(in io.Reader, _w io.Writer) {54 out := bufio.NewWriter(_w)55 defer out.Flush()56 var n, m, op, x, y, l, r int57 Fscan(in, &n, &m)58 w := bits.Len(uint(n))59 sz93 = w * w * 360 pos := make([]int, n+1)61 for i := range n {62 Fscan(in, &x)63 pos[x] = i64 }65 t := newFenwick93(n, n)66 b93 = make([]int, n)67 for i := range b93 {68 Fscan(in, &b93[i])69 b93[i] = pos[b93[i]]70 t.update(i, b93[i], 1)71 }72 73 for range m {74 Fscan(in, &op, &x, &y)75 x--76 y--77 if op == 1 {78 Fscan(in, &l, &r)79 l--80 r--81 Fprintln(out, t.query(l, r, x, y))82 } else {83 t.update(x, b93[x], -1)84 t.update(x, b93[y], 1)85 t.update(y, b93[y], -1)86 t.update(y, b93[x], 1)87 b93[x], b93[y] = b93[y], b93[x]88 }89 }90}91 9293