W×W 矩陣(W≤2e6),初始值 S(實為 0)。M≤160000 次點加操作,Q≤10000 次子矩陣求和查詢。離線處理,輸出每次查詢結果。
將修改與查詢按時間順序混合為一個序列。每個查詢拆為 4 個前綴和查詢(容斥原理)。CDQ 遞歸處理時間區間 [l, r]:
[l, mid] 內部查詢。[mid+1, r]。struct Node { int x, y, val, time, type; }:type=0 修改,type=1 查詢子項。c[] 配合時間戳 tim[] 實現 O(1) 清零(避免每次 memset)。void CDQ(int l, int r) {
if (l==r) return;
int mid = (l+r)>>1;
CDQ(l, mid);
// 左修改 -> 右查詢
sort(q+l, q+mid+1, cmp_x);
sort(q+mid+1, q+r+1, cmp_x);
++T; // 時間戳
int i=l, j=mid+1;
while (j<=r) {
while (i<=mid && q[i].x <= q[j].x) {
if (q[i].type==0) bit.add(q[i].y, q[i].val);
++i;
}
if (q[j].type==1) q[j].ans += bit.query(q[j].y);
++j;
}
CDQ(mid+1, r);
// 歸併按 x 排序
merge(q+l, q+mid+1, q+mid+1, q+r+1, tmp, cmp_x);
copy(tmp, tmp+r-l+1, q+l);
}
主程序讀入操作,修改直接存入,查詢拆 4 個子項存入,按時間排序後調用 CDQ,最後按原查詢順序組合 4 子項輸出答案。