canuc80k4502·3/20

Lật Hình Chữ Nhật

Nộp bài trên LQDOJ

Bài 45 · 2D Fenwick Tree

Mỗi test bắt đầu với một ma trận nhị phân toàn số . Một lệnh có thể lật mọi bit trong một hình chữ nhật đóng; một lệnh khác hỏi bit hiện tại tại đúng một ô.

Input

  • Dòng đầu chứa số test .
  • Mỗi test bắt đầu bằng , sau đó là lệnh.
  • lật hình chữ nhật; hỏi một ô.

Output

  • In bit cho từng lệnh . Sau phần kết quả của hai test liên tiếp có đúng một dòng trống.

Constraints

  • .
  • .
  • ; tọa độ truy vấn cũng nằm trong bảng.

Scoring

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

Example

Test 1

Input

2
3 3
C 1 1 2 2
Q 1 1
Q 3 3
2 2
C 1 2 2 2
Q 2 2

Output

1
0

1

Giải thích: Ở test đầu, hình vuông góc trên trái bị lật nên , còn . Ở test thứ hai, cột bị lật và ô nhận giá trị .

Lời giải tóm tắt
  • Ý tưởng: Xem D là mảng hiệu 2D theo XOR. Muốn XOR 1 lên [x1..x2]×[y1..y2], XOR 1 tại bốn góc hiệu (x1,y1), (x1,y2+1), (x2+1,y1), (x2+1,y2+1). Giá trị thật tại (x,y) là XOR prefix của D tới (x,y). Dùng Fenwick 2D với phép gộp XOR thay cho cộng.
  • Chứng minh: Một góc hiệu bắt đầu hoặc kết thúc ảnh hưởng theo từng trục. Với một ô trong hình chữ nhật, đúng một tổ hợp góc còn hiệu lực nên nhận XOR 1; ngoài hình chữ nhật, số góc còn hiệu lực là chẵn nên triệt tiêu. Fenwick trả đúng XOR prefix của D, do đó query điểm đúng.
  • Độ phức tạp: Update hình chữ nhật và query điểm đều O(log²n); nhớ O(n²).
  • Lưu ý cài đặt: Cập nhật góc x2+1/y2+1 chỉ khi còn trong bảng; dùng cộng thay XOR; quên dòng trống giữa test.