Thay vì mô tả các khối lệnh bằng một dãy BEGIN/END tuần tự, phần này biểu diễn cấu trúc lồng khối của chương trình dưới dạng cây khối cho trước một cách tường minh: có n khối đánh số từ 1 đến n, khối số 1 là khối gốc (không có khối cha). Với mỗi khối i (2≤i≤n), pi là chỉ số khối cha của nó, và pi<i. Mỗi khối i có một danh sách các tên biến được khai báo trực tiếp trong khối đó (dữ liệu vào đảm bảo trong cùng một khối không có hai biến trùng tên).
Theo luật phạm vi tĩnh (static scoping), khi tìm một biến tên v xuất phát từ khối b, trình biên dịch sẽ tìm trong chính khối b trước, nếu không thấy thì tìm tiếp ở khối cha của b, rồi khối cha của khối cha, cứ thế đi lên cho tới khối gốc.
Cho q truy vấn, mỗi truy vấn gồm một khối b và một tên biến v: hãy tìm chỉ số của khối gần b nhất (tính cả b) trên đường đi từ b lên khối gốc mà có khai báo trực tiếp biến tên v; nếu không có khối nào trên đường đi đó khai báo v, trả lời −1.
Ví dụ: cây gồm 4 khối: khối 1 (gốc) khai báo x; khối 2 (cha là 1) khai báo y; khối 3 (cha là 2) không khai báo gì; khối 4 (cha là 1) khai báo x. Với truy vấn (3, x): đường đi 3→2→1, khối 3 và 2 không có x, khối 1 có x ⇒ trả lời 1.
Dòng đầu tiên chứa số nguyên n (1≤n≤1000). n dòng tiếp theo, dòng thứ i mô tả khối i: gồm pi (chỉ số khối cha, quy ước p1=0 nghĩa là khối gốc không có cha), ki (số biến khai báo trực tiếp trong khối i), và ki tên biến cách nhau bởi khoảng trắng (ki có thể bằng 0). Dòng tiếp theo chứa số nguyên q (1≤q≤1000) — số truy vấn. q dòng sau đó, mỗi dòng gồm hai giá trị b và v (chỉ số khối và tên biến cần tra).
In ra q dòng, mỗi dòng là kết quả (chỉ số khối tìm được, hoặc −1) tương ứng với từng truy vấn theo đúng thứ tự.
Ví dụ:
Đầu vào:
4
0 1 x
1 1 y
2 0
1 1 x
3
3 x
3 y
4 x
Đầu ra:
1
2
4
Đầu vào:
1
0 0
1
1 z
Đầu ra:
-1
Đang tải editor...