Cho một dãy gồm đúng 2n số nguyên không âm. Ta rút gọn dãy theo nhiều tầng:
ở tầng đầu tiên, thay từng cặp kề nhau bằng phép OR bit;
ở tầng kế tiếp, thay từng cặp kết quả bằng phép XOR bit;
tiếp tục xen kẽ OR, XOR, OR, XOR, ... cho đến khi chỉ còn một số.
Có m phép cập nhật. Sau mỗi lần thay một phần tử, hãy in số duy nhất nhận được khi rút gọn toàn bộ dãy theo quy tắc trên.
Input
Dòng đầu chứa hai số nguyên n và m.
Dòng thứ hai chứa 2n số nguyên của dãy, theo thứ tự từ trái sang phải.
Mỗi dòng trong m dòng tiếp theo chứa pb, nghĩa là gán phần tử thứ p bằng b.
Output
Sau mỗi cập nhật, in ra một dòng chứa kết quả rút gọn của toàn dãy.
Constraints
1≤n≤17.
1≤m≤105.
0≤ai,b<230.
1≤p≤2n.
Scoring
Subtask 1 (50% số điểm): n≤11,m≤2000.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
2 3
1 6 3 5
1 4
3 4
4 2
Output
1
3
0
Giải thích: Với n=2, từng cặp được OR rồi hai kết quả được XOR. Ba dãy sau cập nhật lần lượt cho (4∣6)xor(3∣5)=1,3 và 0.
Lời giải tóm tắt
Phân tích: Mỗi node cây đoạn biểu diễn kết quả rút gọn của đúng đoạn nó quản lý. Hai node ngay trên lá dùng OR; tầng kế tiếp dùng XOR, rồi tiếp tục xen kẽ. Nếu chiều cao của node tính từ lá là lẻ, phép gộp tại node là OR; nếu chẵn, phép gộp là XOR.
Thuật toán: Xây cây đệ quy và truyền chiều cao của đoạn. Khi cập nhật vị trí p, thay lá rồi đi ngược lên; ở mỗi node, dùng OR hoặc XOR theo parity của chiều cao. Giá trị ở gốc được in sau mỗi cập nhật.
Chứng minh tính đúng đắn: Ở lá, giá trị node đúng bằng phần tử. Giả sử hai node con đã lưu đúng kết quả rút gọn của hai nửa. Quy tắc đề bài áp dụng đúng một phép OR hoặc XOR giữa hai kết quả ấy, và phép được chọn hoàn toàn bởi tầng hiện tại. Do đó node cha cũng đúng. Quy nạp theo chiều cao cho thấy toàn bộ cây đúng sau khi xây.
Chứng minh tính đúng đắn: Một cập nhật chỉ thay một lá; tính lại các tổ tiên bằng cùng quy tắc khôi phục bất biến ở mọi node bị ảnh hưởng. Vì gốc quản lý toàn dãy, giá trị in ra chính là kết quả cần tìm.
Độ phức tạp: Xây O(2^n), mỗi cập nhật O(n)=O(log 2^n), bộ nhớ O(2^n).