canuc80k3115·16/50

Đảo Trạng Thái Trong Nhánh

Nộp bài trên LQDOJ

Bài 31 · Euler Tour

Một hệ thống gồm trạm được tổ chức thành cây gốc tại trạm . Với mỗi trạm , trạm là cha trực tiếp của . Mỗi trạm có trạng thái hoặc .

Bạn phải xử lý hai loại lệnh theo đúng thứ tự xuất hiện:

  • : đảo trạng thái của mọi trạm trong cây con gốc , kể cả ; trạng thái trở thành và ngược lại.
  • : đếm số trạm có trạng thái trong cây con gốc , kể cả .

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số ; là cha của đỉnh . Nếu , dòng này rỗng.

  • Dòng thứ ba chứa số , là trạng thái ban đầu.

  • Dòng thứ tư chứa số nguyên .
  • Mỗi dòng trong dòng tiếp theo có dạng hoặc .

Output

  • Với mỗi lệnh , in một dòng chứa số trạm đang ở trạng thái trong cây con được hỏi.

Constraints

  • .
  • với mọi .
  • .
  • .

Scoring

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

Example

Test 1

Input

7
1 1 2 2 3 6
1 0 1 1 0 0 1
9
get 1
get 2
pow 2
get 2
pow 1
get 1
get 3
pow 6
get 6

Output

4
1
2
2
1
1

Giải thích: Ban đầu toàn cây có bốn trạm bật, còn nhánh chỉ có trạm bật. Sau khi đảo nhánh , hai trạm và bật; đảo toàn cây khiến chỉ còn hai trạm bật, và lần đảo cuối trên nhánh để lại đúng một trạm bật ở đó.

Lời giải tóm tắt
  • Nhận xét: Trong thứ tự vào DFS, toàn bộ cây con của v tạo thành đoạn liên tiếp [tin[v],tout[v]]. Bài toán trở thành đảo toàn bộ bit trên một đoạn và hỏi tổng bit trên đoạn.
  • Thuật toán: Euler hóa cây và đặt trạng thái của đỉnh v tại vị trí tin[v]. Dùng segment tree lưu số bit 1 của mỗi đoạn. Khi đảo trọn một nút cây đoạn, thay sum bằng length-sum và XOR lazy tag với 1; hai lần đảo liên tiếp vì thế tự triệt tiêu. Lệnh get lấy tổng trên đúng đoạn cây con.
  • Chứng minh tính đúng đắn: Đoạn Euler của v chứa đúng và đủ các đỉnh thuộc cây con v. Công thức length-sum đổi chính xác số bit 1 sau khi mọi bit trong đoạn bị đảo, còn lazy XOR giữ đúng hợp thành của nhiều lần đảo. Vì vậy từng lệnh được mô phỏng đúng theo thứ tự và mọi kết quả get là chính xác.
  • Độ phức tạp: Tiền xử lý O(n), mỗi lệnh O(log n), bộ nhớ O(n).