今回の問題は「二次元区間和」である。H 行 W 列 の行列 A があり、2 つの行・列番号の組 {a , b} , {c , d} における区間和 S({a,b} , {c,d}) (a ≦ c , b ≦ d) を以下のように定義する。
S({a,b} , {c,d}) = A[a][b] + A[a][b+1] + ... + A[a][d] + A[a+1][1] + ... + A[a+1][d] + ... + A[c][1] + ... + A[c][d]
各クエリの累積和を問題文で与えられた計算式の通り計算を行うと実行時間制限に間に合わないため、事前に値を計算したり既に計算した値を再利用したりすることで、計算量を落とすことが有効的と言える。
ans[i][j] += ans[i - 1][j] + ans[i][j - 1] - ans[i - 1][j - 1]
は以下の数学的処理を行っている。
ans[i-1][j]: 一行上までの合計ans[i][j-1]: 一列左までの合計ans[i-1][j-1]: 重複して足してしまった左上のエリアを引く
