Một ma trận vuông n×n ban đầu toàn 0. 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 n và m.
Lệnh 1x0y0x1y1 là truy vấn; lệnh 2x0y0x1y1v là cập nhật.
Output
In kết quả của mỗi lệnh loại 1.
Constraints
1≤n≤1000,1≤m≤105.
1≤x0≤x1≤n,1≤y0≤y1≤n.
0≤v<262.
Scoring
Subtask 1 (50% số điểm): n,m≤200.
Subtask 2 (50% 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: Ô (1,1) nhận XOR 5 nên truy vấn đầu cho 5. Sau cập nhật thứ hai, XOR toàn bảng triệt tiêu vì các giá trị 5 và 3 đề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.