# https://w...content-available-to-author-only...j.com/problems/MATSUM/
import sys
def make_grid(n):
return [[0] * n for _ in range(n)]
def add(grid, n, x, y, v):
while x < n:
i = y
while i < n:
grid[x][i] += v
i = i | (i + 1)
x = x | (x + 1)
def set_v(grid, a, n, x, y, v):
add(grid, n, x, y, v - a[x][y])
a[x][y] = v
def prefix_sum(grid, x, y):
res = 0
while x >= 0:
j = y
while j >= 0:
res += grid[x][j]
j = (j & (j + 1)) - 1
x = (x & (x + 1)) - 1
return res
def range_sum(grid, x1, y1, x2, y2):
return (prefix_sum(grid, x2, y2)
+ prefix_sum(grid, x1 - 1, y1 - 1)
- prefix_sum(grid, x1 - 1, y2)
- prefix_sum(grid, x2, y1 - 1))
def main():
data = sys.stdin.read().split()
p = 0
t = int(data[p]); p += 1
out = []
for _ in range(t):
n = int(data[p]); p += 1
grid = make_grid(n)
a = make_grid(n)
while True:
cmd = data[p]; p += 1
if cmd == 'END':
break
if cmd == 'SET':
x = int(data[p]); y = int(data[p+1]); v = int(data[p+2]); p += 3
set_v(grid, a, n, x, y, v)
else:
x1 = int(data[p]); y1 = int(data[p+1])
x2 = int(data[p+2]); y2 = int(data[p+3]); p += 4
out.append(range_sum(grid, x1, y1, x2, y2))
sys.stdout.write('\n'.join(map(str, out)) + '\n')
main()
IyBodHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmouY29tL3Byb2JsZW1zL01BVFNVTS8KaW1wb3J0IHN5cwoKCmRlZiBtYWtlX2dyaWQobik6CiAgICByZXR1cm4gW1swXSAqIG4gZm9yIF8gaW4gcmFuZ2UobildCgpkZWYgYWRkKGdyaWQsIG4sIHgsIHksIHYpOgogICAgd2hpbGUgeCA8IG46CiAgICAgICAgaSA9IHkKICAgICAgICB3aGlsZSBpIDwgbjoKICAgICAgICAgICAgZ3JpZFt4XVtpXSArPSB2CiAgICAgICAgICAgIGkgPSBpIHwgKGkgKyAxKQogICAgICAgIHggPSB4IHwgKHggKyAxKQoKZGVmIHNldF92KGdyaWQsIGEsIG4sIHgsIHksIHYpOgogICAgYWRkKGdyaWQsIG4sIHgsIHksIHYgLSBhW3hdW3ldKQogICAgYVt4XVt5XSA9IHYKCmRlZiBwcmVmaXhfc3VtKGdyaWQsIHgsIHkpOgogICAgcmVzID0gMAogICAgd2hpbGUgeCA+PSAwOgogICAgICAgIGogPSB5CiAgICAgICAgd2hpbGUgaiA+PSAwOgogICAgICAgICAgICByZXMgKz0gZ3JpZFt4XVtqXQogICAgICAgICAgICBqID0gKGogJiAoaiArIDEpKSAtIDEKICAgICAgICB4ID0gKHggJiAoeCArIDEpKSAtIDEKICAgIHJldHVybiByZXMKCmRlZiByYW5nZV9zdW0oZ3JpZCwgeDEsIHkxLCB4MiwgeTIpOgogICAgcmV0dXJuIChwcmVmaXhfc3VtKGdyaWQsIHgyLCB5MikKICAgICAgICAgICAgKyBwcmVmaXhfc3VtKGdyaWQsIHgxIC0gMSwgeTEgLSAxKQogICAgICAgICAgICAtIHByZWZpeF9zdW0oZ3JpZCwgeDEgLSAxLCB5MikKICAgICAgICAgICAgLSBwcmVmaXhfc3VtKGdyaWQsIHgyLCB5MSAtIDEpKQoKZGVmIG1haW4oKToKICAgIGRhdGEgPSBzeXMuc3RkaW4ucmVhZCgpLnNwbGl0KCkKICAgIHAgPSAwCiAgICB0ID0gaW50KGRhdGFbcF0pOyBwICs9IDEKICAgIG91dCA9IFtdCiAgICBmb3IgXyBpbiByYW5nZSh0KToKICAgICAgICBuID0gaW50KGRhdGFbcF0pOyBwICs9IDEKICAgICAgICBncmlkID0gbWFrZV9ncmlkKG4pCiAgICAgICAgYSA9IG1ha2VfZ3JpZChuKQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGNtZCA9IGRhdGFbcF07IHAgKz0gMQogICAgICAgICAgICBpZiBjbWQgPT0gJ0VORCc6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBjbWQgPT0gJ1NFVCc6CiAgICAgICAgICAgICAgICB4ID0gaW50KGRhdGFbcF0pOyB5ID0gaW50KGRhdGFbcCsxXSk7IHYgPSBpbnQoZGF0YVtwKzJdKTsgcCArPSAzCiAgICAgICAgICAgICAgICBzZXRfdihncmlkLCBhLCBuLCB4LCB5LCB2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeDEgPSBpbnQoZGF0YVtwXSk7IHkxID0gaW50KGRhdGFbcCsxXSkKICAgICAgICAgICAgICAgIHgyID0gaW50KGRhdGFbcCsyXSk7IHkyID0gaW50KGRhdGFbcCszXSk7IHAgKz0gNAogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyYW5nZV9zdW0oZ3JpZCwgeDEsIHkxLCB4MiwgeTIpKQogICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nLmpvaW4obWFwKHN0ciwgb3V0KSkgKyAnXG4nKQoKbWFpbigpCg==