Slime And Queries

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 2600 Thời gian: 5.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Cho một cây gồm \(n\) đỉnh được đánh số từ \(1\) đến \(n\). Có một slime đang chiếm đúng \(m\) đỉnh của cây. Đảm bảo rằng đồ thị con cảm sinh bởi các đỉnh bị slime chiếm luôn liên thông.

Ban đầu, slime chiếm các đỉnh \(s_1,s_2,\ldots,s_m\).

Đầu tiên, ta định nghĩa một hàm \(f\) trên một dãy các đỉnh.

Xét dãy \(a_1,a_2,\ldots,a_k\). Có \(k\) miếng thức ăn. Với mỗi \(i\), miếng thức ăn thứ \(i\) nằm tại đỉnh \(a_i\).

Ban đầu chỉ có miếng thức ăn thứ nhất xuất hiện.

Slime có thể thực hiện các thao tác sau bao nhiêu lần tùy ý:

  • Di chuyển (Move). Slime rời khỏi một đỉnh đang chiếm và mở rộng sang một đỉnh chưa bị chiếm.

Cụ thể, gọi \(S\) là tập các đỉnh hiện đang bị slime chiếm. Chọn một đỉnh \(u\in S\) và một đỉnh \(v\notin S\), rồi thay \(S\) bằng \((S\setminus\{u\})\cup\{v\}\).

Sau thao tác này, đồ thị con cảm sinh bởi tập \(S\) vẫn phải liên thông.

  • Ăn (Eat). Nếu miếng thức ăn thứ \(i\) đã xuất hiện và slime hiện đang chiếm đỉnh \(a_i\), thì slime có thể ăn miếng thức ăn thứ \(i\).

Nếu \(1\le i<k\), thì ngay sau đó miếng thức ăn thứ \((i+1)\) sẽ xuất hiện.

Thao tác ăn không làm thay đổi tập các đỉnh mà slime đang chiếm.

Định nghĩa \(f([a_1,a_2,\ldots,a_k])\)số lần thực hiện thao tác Move ít nhất để slime có thể ăn toàn bộ \(k\) miếng thức ăn theo đúng thứ tự, bắt đầu từ trạng thái ban đầu là chiếm các đỉnh \(s_1,s_2,\ldots,s_m\).


\(q\) truy vấn. Dữ liệu đầu vào được mã hóa online.

Đầu vào cho các giá trị đã mã hóa \(p_1,p_2,\ldots,p_q\).

Đặt \(\mathrm{ans}_0=0\).

Với mỗi \(i=1,2,\ldots,q\), đỉnh thực sự của truy vấn thứ \(i\) được xác định bởi:

\[ c_i=((p_i-1+\mathrm{ans}_{i-1}) \bmod n)+1. \]

Sau đó:

\[ \mathrm{ans}_i=f([c_1,c_2,\ldots,c_i]). \]

Với mỗi \(i=1,2,\ldots,q\), hãy in ra \(\mathrm{ans}_i\).

Input

Mỗi test gồm nhiều bộ test.

Dòng đầu tiên chứa số nguyên \(t\) (\(1 \le t \le 10^4\)) — số lượng bộ test.

Với mỗi bộ test:

  • Dòng đầu tiên chứa ba số nguyên \(n\), \(m\), và \(q\) (\(2\le m\le n\le 10^5\), \(1\le q\le 10^5\)) — số đỉnh của cây, số đỉnh hiện đang bị slime chiếm, và số lượng truy vấn.

  • Mỗi trong \(n-1\) dòng tiếp theo chứa hai số nguyên \(u\)\(v\) (\(1\le u,v\le n\), \(u\ne v\)), biểu diễn một cạnh của cây.

  • Dòng tiếp theo chứa \(m\) số nguyên phân biệt \(s_1,s_2,\ldots,s_m\) (\(1\le s_i\le n\)) — các đỉnh ban đầu bị slime chiếm. Đảm bảo rằng các đỉnh này tạo thành một đồ thị con liên thông.

  • Dòng tiếp theo chứa \(q\) số nguyên \(p_1,p_2,\ldots,p_q\) (\(1\le p_i\le n\)) — các đỉnh truy vấn đã được mã hóa.

Đảm bảo rằng:

  • Tổng \(n\) trên tất cả các bộ test không vượt quá \(10^5\).
  • Tổng \(q\) trên tất cả các bộ test không vượt quá \(10^5\).

Output

Với mỗi bộ test, in ra \(q\) số nguyên.

Số nguyên thứ \(i\) phải là giá trị \(\mathrm{ans}_i\).

Example

Example

Input
10
5 2 3
3 5
2 1
4 3
3 2
1 2
1 4 3
6 3 4
5 1
1 3
6 1
4 1
2 1
1 2 3
5 2 5 6
7 3 5
3 7
4 2
1 3
2 1
6 3
5 2
1 2 4
7 3 2 5 2
5 2 5
3 1
1 5
2 1
4 1
1 2
3 3 3 4 2
6 3 6
4 6
3 2
1 2
5 4
2 4
2 4 5
6 6 1 2 4 6
7 4 5
5 2
3 1
2 1
3 7
6 3
4 2
1 2 3 4
7 4 4 5 1
4 3 4
3 1
1 4
2 1
1 2 3
4 1 2 3
6 2 5
2 4
5 4
2 1
6 4
3 2
1 2
6 1 1 1 2
7 2 5
2 4
7 3
3 6
1 3
1 2
5 2
1 2
4 6 1 6 5
8 4 6
5 2
3 2
7 5
4 3
8 7
1 2
6 5
2 3 4 5
8 7 3 3 7 8
Output
0 2 3 
1 1 2 3 
2 4 6 8 9 
1 2 3 4 4 
1 2 3 4 4 4 
1 2 3 3 4 
1 1 2 2 
2 4 6 8 9 
1 4 7 10 11 
2 3 4 4 5 5 

Nguồn: CodeForces

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.