canuc80k6114·15/33

XOR lớn nhất trên đoạn

Nộp bài trên LQDOJ

Bài 6.2 · XOR Basis

Cho dãy giá trị và đoạn . Với mỗi đoạn, chọn một tập con vị trí bất kỳ trong đoạn và lấy XOR các giá trị. Tập con được phép rỗng và khi đó XOR bằng . Hãy in XOR lớn nhất có thể.

Input

  • Dòng đầu chứa .
  • Dòng tiếp theo chứa .
  • Dòng tiếp theo chứa , rồi dòng chứa .

Output

  • In một XOR lớn nhất cho mỗi truy vấn.

Constraints

  • .
  • .
  • .

Scoring

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

Example

Test 1

Input

4
1 2 4 8
3
1 3
2 4
3 3

Output

7
14
4

Giải thích: Ba đoạn lần lượt sinh được các giá trị lớn nhất và bằng cách chọn toàn bộ các bit độc lập phù hợp.

Lời giải tóm tắt
  • Mô hình: Cho dãy giá trị c_1..c_n và q đoạn [l,r]. Với mỗi đoạn, chọn một tập con vị trí bất kỳ trong đoạn và lấy XOR các giá trị. Tập con được phép rỗng và khi đó XOR bằng 0. Hãy in XOR lớn nhất có thể.
  • Thuật toán: Sắp xếp truy vấn theo r, quét dãy và chèn bằng latest-position basis 20 bit. Với truy vấn [l,r], đặt ans=0, duyệt pivot từ cao xuống; chỉ xét pivot có pos>=l, và XOR nếu làm ans tăng.
  • Thuật toán: Do invariant latest-position, các pivot được phép sinh đúng span đoạn. Greedy maximum giống bài 02.
  • Chứng minh đúng: Bài 14 đã chứng minh các pivot pos>=l sinh đúng span [l,r]. Trên cơ sở đó, quyết định greedy từ bit cao xuống cho phần tử lớn nhất của span. Vì vậy câu trả lời cho mỗi đoạn là maximum subset XOR chính xác.
  • Độ phức tạp: O((n+q)*20 + q log q) thời gian, O(n+q) bộ nhớ.