Cho một cây gồm n đỉnh, đánh số từ 1 đến n và được xem là có gốc tại đỉnh 1. Với hai đỉnh u,v, ký hiệu lca(u,v) là tổ tiên chung gần nhất của chúng trong cây có gốc này.
Có q truy vấn nhưng các cặp đỉnh không được liệt kê trực tiếp. Input cung cấp sáu số ustart,vstart,ujump,vjump,uadd,vadd theo đúng thứ tự đó. Đặt
Dấu modn được thực hiện trước khi cộng 1, vì vậy mọi ui,vi đều thuộc đoạn [1,n]. Gọi xi=lca(ui,vi). Hãy tính
x1⊕x2⊕⋯⊕xq,
trong đó ⊕ là phép XOR bit.
Input
Dòng đầu chứa hai số nguyên n,q.
n−1 dòng tiếp theo, mỗi dòng chứa hai số nguyên a,b biểu diễn một cạnh vô hướng của cây.
Dòng cuối chứa sáu số nguyên theo thứ tự ustart,vstart,ujump,vjump,uadd,vadd.
Output
In một số nguyên duy nhất: XOR của đáp án của toàn bộ q truy vấn.
Constraints
1≤n≤105.
1≤q≤107.
Mỗi cạnh nối hai đỉnh khác nhau trong đoạn [1,n]; n−1 cạnh tạo thành một cây.
1≤ustart,vstart≤n.
0≤ujump,vjump,uadd,vadd≤109.
Các phép nhân khi sinh truy vấn phải được tính bằng kiểu số nguyên đủ lớn trước khi lấy modulo.
Input chỉ chứa một test case.
Scoring
Subtask 1 (50 điểm):n,q≤1000.
Subtask 2 (50 điểm): không có giới hạn bổ sung.
Example
Test 1
Input
7 5
1 2
1 3
2 4
2 5
3 6
6 7
4 5 2 3 0 1
Output
2
Giải thích: Năm cặp được sinh lần lượt là (4,5),(2,3),(5,4),(4,7),(2,2), có các LCA tương ứng 2,1,2,1,2. XOR của dãy này bằng 2.
Lời giải tóm tắt
Ý tưởng: Với tới 107 truy vấn, chi phí O(logn) cho mỗi LCA có thể quá lớn. Ta biến LCA thành một truy vấn cực tiểu trên dãy Euler.
Ý tưởng: Duyệt cây từ gốc 1. Ghi một đỉnh khi đi vào nó và ghi lại đỉnh cha sau mỗi lần quay lui; đồng thời lưu first[v], vị trí xuất hiện đầu tiên của v. Trên đoạn Euler từ first[u] đến first[v], đỉnh có độ sâu nhỏ nhất chính là lca(u,v): quá trình DFS phải đi từ nhánh của một đầu mút lên tới tổ tiên chung rồi mới xuống nhánh của đầu còn lại, và không thể đi lên cao hơn LCA trong đoạn đó.
Ý tưởng: Ta xây sparse table trên các vị trí Euler, phép gộp chọn vị trí chứa đỉnh nông hơn. RMQ cực tiểu là phép idempotent nên một đoạn được trả lời bằng hai khối độ dài lũy thừa hai trong O(1). Sau đó sinh lần lượt đúng q cặp; sau khi dùng (ui,vi) mới cập nhật hai giá trị bằng công thức modulo n rồi cộng 1. Mỗi LCA được XOR ngay vào biến kết quả nên không cần lưu dãy truy vấn.
Ý tưởng: Tiền xử lý tốn O(nlogn) thời gian và bộ nhớ; phần truy vấn tốn O(q) thời gian.