canuc80k4516·17/20

XOR Trên Ma Trận

Nộp bài trên LQDOJ

Bài 45 · 2D Fenwick Tree

Một ma trận vuông ban đầu toàn . Mỗi thao tác hoặc XOR cùng một giá trị vào mọi ô của một hình chữ nhật đóng, hoặc hỏi XOR của mọi ô trong một hình chữ nhật đóng.

Input

  • Dòng đầu chứa và .
  • Lệnh là truy vấn; lệnh là cập nhật.

Output

  • In kết quả của mỗi lệnh loại .

Constraints

  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

3 4
2 1 1 2 2 5
1 1 1 1 1
2 2 2 3 3 3
1 1 1 3 3

Output

5
0

Giải thích: Ô nhận XOR nên truy vấn đầu cho . Sau cập nhật thứ hai, XOR toàn bảng triệt tiêu vì các giá trị và đều xuất hiện số lần chẵn trong vùng tương ứng.

Lời giải tóm tắt
  • Ý tưởng: Dùng mảng hiệu XOR D; rectangle update là XOR v tại bốn góc. Xét prefix XOR của ma trận thật tới (X,Y). Một D[x][y] xuất hiện (X-x+1)(Y-y+1) lần; nó còn lại iff cả hai thừa số lẻ, tương đương x%2=X%2 và y%2=Y%2.
  • Ý tưởng: Vì vậy giữ bốn Fenwick 2D F[px][py]; point update D[x][y] đi vào cây theo parity của (x,y). prefix(X,Y) chỉ query cây F[X%2][Y%2]. Rectangle query XOR bốn prefix.
  • Chứng minh: Lập luận số lần xuất hiện chứng minh công thức prefix parity. Bốn corner updates duy trì đúng difference XOR của mọi rectangle update. Inclusion-exclusion dưới phép XOR (cũng là XOR bốn prefix) giữ đúng các ô trong rectangle truy vấn.
  • Độ phức tạp: Mỗi lệnh O(log²n); nhớ bốn bảng O(n²) (~32 MB với n=1000 và 64-bit).
  • Lưu ý cài đặt: Tên bài đúng là Iahub and Xors; giá trị cần 64-bit unsigned/signed đủ 62 bit; chọn cây theo parity của cận prefix, không phải parity query rectangle.